【问题标题】:How to use the __subclasscheck__ magic method?如何使用 __subclasscheck__ 魔术方法?
【发布时间】:2016-04-09 23:33:39
【问题描述】:

我们怎样才能让一个类对他的子类撒谎?

在阅读了doc 之后,我尝试了这个:

>>> class AllYourBase(type):
...     @classmethod
...     def __subclasscheck__(cls, other):
...         return True
...     
>>> class AllYour(object):
...     __metaclass__ = AllYourBase

现在,这个班级应该报告你所有的基地都属于他。

但它不起作用:

>>> issubclass(AllYour, int)
False

为什么不呢?

【问题讨论】:

    标签: python inheritance python-2.x subclassing metaclass


    【解决方案1】:

    如果您希望AllYour 声称是每个类的子类,那是不可能的。 __subclasscheck__ 在另一个方向工作。

    如果您希望 AllYour 声明每个类都继承它,请删除 @classmethod 装饰器,并在 issubclass 调用中切换参数。您在元类上定义的特殊方法不需要特殊修饰。

    【讨论】:

    • 确实,@classmethod 意味着 元类 将被传递给 __subclasscheck__()。您需要一个常规实例方法(该实例是 AllYour 类)。
    • 移除这个装饰器并没有改变行为
    • @wim:仔细检查后,您的issubclass 调用中的参数似乎顺序错误。 Fixing that produces a result of True. 如果你想要一个声称是每个类的子类的类,而不是声称每个类都是它的子类,那是不可能的。
    • 哦,对了。我想要另一种方式。我们可以猴子补丁type.__subclasscheck__ 吗?
    • @wim:也许如果你以正确的方式使用 ctypes。不过,它真的很脆弱。我尝试使用gc.getreferents(type.__dict__)[0] 修补type.__subclasscheck__ 以通过dict_proxy,但它只会使Python 崩溃。
    猜你喜欢
    • 2015-08-08
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多