首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >关于如何在python中使用属性特性的真实示例?

关于如何在python中使用属性特性的真实示例?
EN

Stack Overflow用户
提问于 2011-06-10 16:48:36
回答 7查看 71.9K关注 0票数 147

我对如何在Python中使用@property很感兴趣。我已经阅读了python文档,在我看来,其中的示例只是一个玩具代码:

代码语言:javascript
复制
class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

我不知道包装填充了属性装饰器的_x有什么好处。为什么不像下面这样实现:

代码语言:javascript
复制
class C(object):
    def __init__(self):
        self.x = None

我认为,属性功能在某些情况下可能会很有用。但是什么时候呢?有人能给我一些真实世界的例子吗?

EN

回答 7

Stack Overflow用户

发布于 2011-06-10 17:06:20

其他的例子是验证/过滤设置的属性(强制它们在边界或可接受的范围内),以及对复杂或快速变化的术语的懒惰评估。

隐藏在属性后面的复杂计算:

代码语言:javascript
复制
class PDB_Calculator(object):
    ...
    @property
    def protein_folding_angle(self):
        # number crunching, remote server calls, etc
        # all results in an angle set in 'some_angle'
        # It could also reference a cache, remote or otherwise,
        # that holds the latest value for this angle
        return some_angle

>>> f = PDB_Calculator()
>>> angle = f.protein_folding_angle
>>> angle
44.33276

验证:

代码语言:javascript
复制
class Pedometer(object)
    ...
    @property
    def stride_length(self):
        return self._stride_length

    @stride_length.setter
    def stride_length(self, value):
        if value > 10:
            raise ValueError("This pedometer is based on the human stride - a stride length above 10m is not supported")
        else:
            self._stride_length = value
票数 94
EN

Stack Overflow用户

发布于 2011-06-10 16:58:22

看看this article的一个非常实用的用法。简而言之,它解释了在Python语言中,您通常可以如何抛弃显式的getter/setter方法,因为如果您在某个阶段需要它们,您可以使用property实现无缝实现。

票数 22
EN

Stack Overflow用户

发布于 2011-06-10 17:05:33

我用它做的一件事是缓存存储在数据库中的缓慢查找但不变的值。这适用于任何你的属性需要计算或一些其他长操作的情况。数据库检查、网络通信),这些都是您只想按需完成的。

代码语言:javascript
复制
class Model(object):

  def get_a(self):
    if not hasattr(self, "_a"):
      self._a = self.db.lookup("a")
    return self._a

  a = property(get_a)

这是在一个web应用程序中,任何给定的页面视图可能只需要一个这种特定的属性,但底层对象本身可能有几个这样的属性-在构造时初始化它们都是浪费的,属性允许我灵活地选择哪些属性是懒惰的,哪些不是。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6304040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档