gpt4 book ai didi

python - __getattr__ 的不对称行为,新式与旧式类

转载 作者:太空狗 更新时间:2023-10-29 21:01:52 24 4
gpt4 key购买 nike

第一次写到这里,如有内容不集中或太长请见谅。

我有兴趣进一步了解如何在需要时获取对象的属性。所以我阅读了名为“数据模型”的 Python 2.7 文档 here ,我遇到了 __getattr__,为了检查我是否理解它的行为,我编写了这些简单(且不完整)的字符串包装器。

class OldStr:
def __init__(self,val):
self.field=val

def __getattr__(self,name):
print "method __getattr__, attribute requested "+name

class NewStr(object):
def __init__(self,val):
self.field=val

def __getattr__(self,name):
print "method __getattr__, attribute requested "+name

如您所见,它们除了是旧式类还是新式类之外是相同的。由于引用的文本说 __getattr__ 是“当属性查找未在通常位置找到属性时调用”,我想对这些类的两个实例尝试 + 操作以查看发生了什么,期待相同的行为。

但是得到的结果让我有点疑惑:

>>> x=OldStr("test")
>>> x+x
method __getattr__, attribute requested __coerce__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

很好!我没有为 __coerce__ 定义一个方法(尽管我期待对 __add__ 的请求,没关系 :),所以 __getattr__ 参与并返回了一个没用的东西。但是后来

>>> y=NewStr("test")
>>> y+y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NewStr' and 'NewStr'

为什么在使用像 + 这样的内置运算符时,旧式类和新式类中的 __getattr__ 之间会出现这种不对称行为?有人可以帮助我了解发生了什么,我在阅读文档时犯了什么错误吗?

非常感谢,非常感谢您的帮助!

最佳答案

参见 Special method lookup for new-style classes .

直接在类对象中查找特殊方法,绕过实例对象和 __getattr__()__getattribute__()。出于完全相同的原因,instance.__add__ = foobar 不起作用。

这样做是为了加速属性访问。特殊方法的调用非常频繁,使它们符合标准,相当复杂的属性查找会显着降低解释器的速度。

旧式类的属性查找要简单得多(最值得注意的是旧式类不支持描述符),因此没有理由以不同方式对待旧式类中的特殊方法。

关于python - __getattr__ 的不对称行为,新式与旧式类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3415816/

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