gpt4 book ai didi

python - 从另一个对象分配 __len__() 方法

转载 作者:行者123 更新时间:2023-11-28 22:00:15 24 4
gpt4 key购买 nike

我要实现一些容器对象。

class A:
def __init__(self, L):
self.L = list(L)
def __len__(self):
return len(self.L)

class B:
def __init__(self, L):
self.L = list(L)
self.__len__ = self.L.__len__

在第一种情况下,同时使用 len().__len__()

>>> a = A(range(10))
>>> a.__len__()
10
>>> len(a)
10

但在第二种情况下,len() 出现错误。

>>> b = B(range(10))
>>> b.__len__()
10
>>> len(b)
Traceback (most recent call last):
File "<pyshell#93>", line 1, in <module>
len(b)
TypeError: object of type 'B' has no len()
  1. 为什么 len() 在第二种情况下不起作用,而 .__len__() 已定义并且可以正常工作?
  2. 通常可以将一个对象的某些方法分配给另一个对象吗?就像我对 self.L.__len__() 所做的那样。

最佳答案

你不能这样做,像 __len__ 这样的特殊钩子(Hook)方法总是在类型上查找,而不是在实例上查找。

换句话说,len(ob) 调用type(ob).__len__(ob)不是 ob.__len__ ()

参见 Special method lookup documentation ;我解释了为什么这是 in a previous answer .

对于不是特殊钩子(Hook)的方法(以双下划线开头和结尾),您可以自由地将方法分配给您的实例,没有技术的理由阻止您从这样做。

如果您的目标是提供 facade object然后一定要复制方法。我认为这样做没有明显的缺点。直接在您的实例上调用该方法,而不必通过包装器方法进行路由,性能会稍微好一些(您为包装器方法保存了堆栈推送和弹出)。

关于python - 从另一个对象分配 __len__() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15159807/

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