python - 如何在不修改类的情况下使 len() 在类的不同实例上使用不同的方法?

标签 python instance-methods

有没有办法让 len() 在不修改类的情况下使用实例方法?

我的问题示例:

>>> class A(object):
...     pass
...
>>> a = A()
>>> a.__len__ = lambda: 2
>>> a.__len__()
2
>>> len(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'A' has no len()

注意:

  • A 的不同实例将附加不同的 __len__ 方法
  • 我无法更改类A

最佳答案

没有。 Python 总是通过对象的类查找特殊方法。这有几个很好的理由,一个是 repr(A) 应该使用 type(A).__repr__ 而不是 A.__repr__,它旨在处理 A 的实例而不是 A 类本身。

如果您希望 A 的不同实例以不同方式计算它们的 len,请考虑将 __len__ 委托(delegate)给另一个方法:

class A(object):
    def __len__(self):
        return self._len()

a = A()
a._len = lambda: 2

关于python - 如何在不修改类的情况下使 len() 在类的不同实例上使用不同的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36557079/

相关文章:

ruby-on-rails - 我知道如何设置类方法,但如何动态设置实例方法?

python - 如何从协议(protocol)外部发送 Autobahn/Twisted WAMP 消息?

python 维基百科抓取 - 获取其他语言的同一页面的链接?

python - 我们可以在@classmethod 函数中调用用户定义的实例方法吗?

java - 使用 'this' 调用实例方法与不使用 'this' 调用实例方法 - 有区别吗?

ruby - Swift 实例 vs 类方法加上类继承

python - 如何查找了解主题或其他方式的 rdf 对象?

python - 任何加速 itertool.product 的方法

python - 如何验证 pip 包的 PGP key ?

c# - 实例方法是否不在c#中创建对象引用