我写了这样的代码
>>> class a(object):
def __init__(self):
self.__call__ = lambda x:x
>>> b = a()
我期望类的对象a
应该是可调用对象,但显然不是,我不明白为什么。
>>> b()
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
b()
TypeError: 'a' object is not callable
>>> callable(b)
False
>>> hasattr(b,'__call__')
True
特殊方法可在type正在操作的对象的(例如,类),而不是特定的实例。想一想:否则,如果一个类定义了__call__
例如,当该类被称为__call__
应该被称为...真是一场灾难!但幸运的是,特殊方法是在类的类型(又名元类)上查找,一切都很好(“遗留类”在这方面有非常不规则的行为,这就是为什么我们使用新型类会更好 -这是 Python 3 中仅存的)。
因此,如果您需要“按实例重写”特殊方法,则必须确保该实例具有其自己的唯一类。这很简单:
class a(object):
def __init__(self):
self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
self.__class__.__call__ = lambda x:x
你就在那里。当然,在这种情况下这是愚蠢的,因为每个实例最终都只有相同的“所谓的每个实例”(!)__call__
,但如果您确实需要在每个实例的基础上进行覆盖,那么它会很有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)