gpt4 book ai didi

Python:谓词方法作为属性?

转载 作者:太空狗 更新时间:2023-10-30 00:14:12 24 4
gpt4 key购买 nike

通过使用 @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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com