python - 在python中使对象可调用的问题

标签 python

我写了这样的代码

>>> 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/

相关文章:

python - 我如何在 Pygame 中使用 Sprite Sheets?

C++ I/O 和 Python

python - PyDev 中单元测试的初始化?

python - 如何在sql命令中使用python变量

python - Python 中的 Euler 项目 #3

python - 按条件对 numpy 数组进行就地分区

来自 "Pro Coder"示例的 Python 二叉搜索树

python - 如果在后台执行脚本,如何在 Blender Python 上使用旋转运算符?

python - 将 csv 文件加载到 pandas 数据框中

python - 追加到元组中定义的列表 - 这是一个错误吗?