开发者社区> 问答> 正文

在自定义Python类中动态地重新分配

过去可以在运行时设置内部函数,如_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

展开
收起
kun坤 2019-12-28 13:56:10 400 0
1 条回答
写回答
取消 提交回答
  • 魔法方法只在类中查找,而不是在实例中查找,如本文所述。Py2中的新样式类也是如此(cf https://docs.python.org/2.7/reference/datamodel.html#特殊方法-查找新样式类)。 我猜主要的动机是为了获得更好的性能而减少查询,但可能还有其他原因,我不知道。 编辑:实际上,动机在2.7 doc中有明确的解释: 然后: 最后: 因此,这实际上主要是性能优化—当您了解Python的属性查找机制以及Python的“方法”是如何实现的时,这并不奇怪。

    2019-12-28 13:56:16
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载