Python:谓词方法作为属性?

标签 python pep8

通过使用 @property 装饰器,Python 完全消除了对对象属性(有些人可能会说“属性”)的 getter 和 setter 的需要。这使代码更简单,同时在事情确实需要变得更复杂时保持可扩展性。

不过,我想知道以下这种方法的 Pythonic 方法是什么。假设我有以下类(class):

class A(object):
    def is_winner(self):
        return True  # typically a more arcane method to determine the answer

此类方法通常不带参数,也没有副作用。人们可以称这些为谓词。鉴于它们的名字,它们通常与人们可能作为属性(property)存储的东西非常相似。

我倾向于在上面添加一个 @property 装饰器,以便能够将其称为对象属性(即 foo.is_winner),但是我想知道这是否是标准做法。乍一看,我找不到关于这个主题的任何文档。这种情况有统一的标准吗?

最佳答案

似乎普遍的共识是属性通常被认为是即时的并且几乎可以免费使用,所以如果被装饰为@property 的计算是昂贵的,那么最好缓存结果以供重复使用使用(@Martijn Pieters)或将其保留为方法,因为通常预计方法比属性查找花费更多时间。 PEP 8特别注意:

  • 注意 2:尽管缓存等副作用通常没有问题,但尽量避免功能行为产生副作用。

  • 注意 3:避免将属性用于计算量大的操作;属性符号让调用者相信访问(相对)便宜。


@property 装饰器的一个特殊用例是向类添加一些行为,而不需要类的用户从 foo.bar 引用更改为 foo.bar() 调用——例如,如果您想计算某个属性被引用的次数,您可以将该属性转换为 @property,其中装饰方法在返回请求的数据之前操纵某些状态。

这是原始类的示例:

class Cat(object):
    def __init__(self, name):
        self.name = name

# In user code
baxter = Cat('Baxter')
print(baxter.name)  # => Baxter

使用@property 装饰器,我们现在可以在不影响用户代码的情况下添加一些底层机制:

class Cat(object):
    def __init__(self, name):
        self._name = name
        self._name_access_count = 0

    @property
    def name(self):
        self._name_access_count += 1
        return self._name

# User code remains unchanged
baxter = Cat('Baxter')
print(baxter.name)  # => Baxter

# Also have information available about the number of times baxter's name was accessed
print(baxter._name_access_count)  # => 1
baxter.name                       # => 'Baxter'
print(baxter._name_access_count)  # => 2

在一些博客文章(12)中提到了 @property 装饰器的这种处理方式作为主要用例之一——允许我们最初编写可能的最简单代码,然后再切换当我们需要功能时,转到@propery-decorated 方法。

关于Python:谓词方法作为属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29568304/

相关文章:

python - 按 Pandas 组顺序计算差异

python - 如何使用tcpdump和c++重新创建文件?

python - Pycharm community 5.0,如何编辑pep8校验规则

python - 使用 datetime.datetime 在 python 中从用户获取输入日期

python - Python中的递归函数悖论..如何解释?

python - 使用 python 和 arcpy 删除地理数据库中的数据时出现错误

Python PEP8 约定

python - PEP8 和使用长关键字参数初始化对象

python - 大量使用 **kwargs 来提高可读性是否被认为是好的做法?

python - Python 中 "import as"的用例