在python中使对象可调用的问题
我写了这样的代码在python中使对象可调用的问题,python,Python,我写了这样的代码 >>> class a(object): def __init__(self): self.__call__ = lambda x:x >>> b = a() class a(object): def __init__(self): self.myfunc = lambda x:x def __call__(self): return self.my
>>> class a(object):
def __init__(self):
self.__call__ = lambda x:x
>>> b = a()
class a(object):
def __init__(self):
self.myfunc = lambda x:x
def __call__(self):
return self.myfunc(self)
我期望类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
>>>
>>b()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
b()
TypeError:“a”对象不可调用
>>>可调用(b)
假的
>>>hasattr(b,“呼叫”)
真的
>>>
我不明白为什么。
请帮助我。
\uuuuuuuuuuuuuuuuuu
需要在类上定义,而不是在实例上定义
class a(object):
def __init__(self):
pass
__call__ = lambda x:x
但是大多数人可能会发现用通常的方式定义方法更具可读性
class a(object):
def __init__(self):
pass
def __call__(self):
return self
如果您需要对每个实例有不同的行为,您可以这样做
>>> class a(object):
def __init__(self):
self.__call__ = lambda x:x
>>> b = a()
class a(object):
def __init__(self):
self.myfunc = lambda x:x
def __call__(self):
return self.myfunc(self)
特殊方法是在操作对象的类型(例如类)上查找的,而不是在特定实例上查找的。想想看:否则,如果一个类定义了
\uuuuu call\uuuu
,例如,当该类被调用时,\uuuu call\uuuu
应该被调用。。。真是一场灾难!但幸运的是,这个特殊的方法取而代之的是在类的类型(也称为元类)上查找,而且一切都很好(“遗留类”在这方面有非常不规则的行为,这就是为什么我们使用新样式的类会更好——它们是Python 3中仅存的类)
因此,如果需要“每个实例重写”特殊方法,则必须确保该实例具有自己的唯一类。这很简单:
class a(object):
def __init__(self):
self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
self.__class__.__call__ = lambda x:x
你就在那里。当然,在这种情况下,这是愚蠢的,因为每个实例最终都会得到相同的“所谓的每个实例”(!)\uuuu call\uuuu
,但是如果您确实需要在每个实例的基础上进行重写,这将非常有用。这是怎么回事?
定义基类AllowDynamicCall:
class AllowDynamicCall(object):
def __call__(self, *args, **kwargs):
return self._callfunc(self, *args, **kwargs)
class Example(AllowDynamicCall):
def __init__(self):
self._callfunc = lambda s: s
然后子类AllowDynamicCall:
class AllowDynamicCall(object):
def __call__(self, *args, **kwargs):
return self._callfunc(self, *args, **kwargs)
class Example(AllowDynamicCall):
def __init__(self):
self._callfunc = lambda s: s
如果我想在运行时创建不同的每实例可调用函数,该怎么办?你能给我一个建议的方法吗?谢谢你的回复。我想做些合成糖。您可以想象这样制作一个动态函数生成器。A类:b=创建自定义函数(“AA”)c=创建自定义函数(“BB”)