Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使对象可调用的问题_Python - Fatal编程技术网

在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”)