gpt4 book ai didi

python - 在新型类中实现 __getitem__

转载 作者:太空狗 更新时间:2023-10-30 01:02:42 24 4
gpt4 key购买 nike

我有这个代码:

class A:
def __init__(self):
def method(self, item):
print self, ": Getting item", item
self.__getitem__ = types.MethodType(method, self, self.__class__)

class B(object):
def __init__(self):
def method(self, item):
print self, ": Getting item", item
self.__getitem__ = types.MethodType(method, self, self.__class__)

然后这工作正常:

a = A()
a[0]

但这不是:

b = B()
b[0]

引发类型错误。

我发现新型类在类 __dict__ 而不是实例 __dict__ 中寻找魔术方法。这是正确的吗?为什么会这样?你知道任何解释背后想法的文章吗?我试过 RTFM,但可能不是正确的,或者没听清楚...

非常感谢!保罗

最佳答案

这在 Python 数据模型文档中有记录:Special method lookup for new-style classes :

For new-style classes, implicit invocations of special methods are only guaranteed to work correctly if defined on an object’s type, not in the object’s instance dictionary.

The rationale behind this behaviour lies with a number of special methods such as __hash__() and __repr__() that are implemented by all objects, including type objects. If the implicit lookup of these methods used the conventional lookup process, they would fail when invoked on the type object itself[.]

因此,因为 hash(int) hash(1) 都必须工作,所以在类型上查找特殊方法而不是在实例上。如果直接在对象上查找 __hash__()hash(int) 将被转换为 int.__hash__(),这将失败,因为 int.__hash__() 是一个未绑定(bind)的方法,它期望在 int() 的实际实例上调用(例如 1);所以对于 hash(int),应该调用 type.__hash__():

>>> hash(1) == int.__hash__(1)
True
>>> hash(int) == type.__hash__(int)
True
>>> int.__hash__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor '__hash__' of 'int' object needs an argument

这是一个向后不兼容的变化,所以它只适用于新样式的对象。

关于python - 在新型类中实现 __getitem__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14102407/

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