gpt4 book ai didi

python - 如何使 Python 子类不可调用

转载 作者:IT老高 更新时间:2023-10-28 21:03:47 34 4
gpt4 key购买 nike

您如何“禁用”子类上的 __call__ 方法,以便以下情况成立:

class Parent(object):
def __call__(self):
return

class Child(Parent):
def __init__(self):
super(Child, self).__init__()
object.__setattr__(self, '__call__', None)

>>> c = Child()
>>> callable(c)
False

尝试将 __call__ 设置为某些不可调用值的这种方式和其他方式仍会导致子项显示为可调用值。

最佳答案

你不能。正如 jonrsharpe 指出的那样,没有办法让 Child 看起来没有该属性,而这正是 callable(Child()) 赖以产生答案的原因。根据此错误报告,即使将其设为引发 AttributeError 的描述符也不起作用:https://bugs.python.org/issue23990 .一个 python 2 示例:

>>> class Parent(object):
... def __call__(self): pass
...
>>> class Child(Parent):
... __call__ = property()
...
>>> c = Child()
>>> c()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: unreadable attribute
>>> c.__call__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: unreadable attribute
>>> callable(c)
True

这是因为 callable(...) 不执行描述符协议(protocol)。实际调用对象或访问 __call__ 属性涉及通过普通描述符协议(protocol)检索方法,即使它位于属性后面。但是 callable(...) 并没有费心去那么远,如果它找到任何东西就满足了,并且 Parent 的每个子类都会有 something 用于 __call__ -- 子类中的一个属性,或者来自 Parent 的定义。

因此,虽然您可以使实际调用实例失败并出现任何您想要的异常,但您永远不能让 callable(some_instance_of_parent) 返回 False。

关于python - 如何使 Python 子类不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30225477/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com