我写了这样的代码
>>> 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
>>>
我不明白为什么。 请帮帮我。
最佳答案
特殊方法是在被操作的对象的类型(例如,类)上查找的,而不是在特定实例上。想一想:否则,例如,如果一个类定义了 __call__
,那么当调用该类时,应该调用 __call__
......真是一场灾难!但幸运的是,这个特殊方法是在类的类型上查找的,AKA 元类,一切都很好(“遗留类”在这方面有非常不规则的行为,这就是为什么我们都最好使用新式的——这是 Python 3 中唯一剩下的那些)。
因此,如果您需要“按实例覆盖”特殊方法,则必须确保实例具有自己的唯一类。这很容易:
class a(object):
def __init__(self):
self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
self.__class__.__call__ = lambda x:x
你就在那里。当然,在这种情况下这会很愚蠢,因为每个实例都以相同的“所谓的每个实例”(!)__call__
结束,但如果你真的需要覆盖它会很有用以单个实例为基础。
关于python - 在python中使对象可调用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1705928/