过去可以在运行时设置内部函数,如_len__()。下面是一个例子:
#! /usr/bin/python3
import sys
class FakeSequence:
def __init__(self):
self.real_sequence = list()
self.append = self.real_sequence.append
self.__len__ = self.real_sequence.__len__
def workaround__len__(self):
return len(self.real_sequence)
if __name__ == '__main__':
fake_sequence = FakeSequence()
fake_sequence.append(1)
fake_sequence.append(2)
fake_sequence.append(3)
length = len(fake_sequence)
sys.stdout.write("len(fake_sequence) is %d\n" % (length))
下面是你试着运行它的结果:
$ python2 len_test
len(fake_sequence) is 3
$ python3 len_test
Traceback (most recent call last):
File "len_test", line 18, in <module>
length = len(fake_sequence)
TypeError: object of type 'FakeSequence' has no len()
如果我将_len__()方法定义为类的一部分(删除上面的“变通方法”),它的工作方式与您所期望的一样。如果我定义了_len__()并像上面那样重新分配FakeSequence。调用了_len__(),它不会访问新分配的_len__(),它总是调用FakeSequence类方法。 你能给我一些文档来解释为什么为成员函数分配实例方法不再有效吗?注意,分配非双下划线方法仍然可以。我可以很容易地解决这个问题,我更关心的是我在从python2到python3的转换中漏掉了一些基本的东西。上面的行为与我可以轻松访问的Python 3解释器是一致的(3.4、3.6、3.7)。 问题来源StackOverflow 地址:/questions/59381104/dynamically-reassign-len-in-a-custom-python-class
魔法方法只在类中查找,而不是在实例中查找,如本文所述。Py2中的新样式类也是如此(cf https://docs.python.org/2.7/reference/datamodel.html#特殊方法-查找新样式类)。 我猜主要的动机是为了获得更好的性能而减少查询,但可能还有其他原因,我不知道。 编辑:实际上,动机在2.7 doc中有明确的解释: 然后: 最后: 因此,这实际上主要是性能优化—当您了解Python的属性查找机制以及Python的“方法”是如何实现的时,这并不奇怪。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。