为什么子类化ABCMeta和collections.Mapping会中断isinstance(...,collection.Mapping)?

时间:2018-08-21 13:39:29

标签: python-3.x inheritance mapping abc

在python 3.5.2、3.5.3、3.6.3(也许是其他未经测试)中的代码:

from abc import ABCMeta
import collections

class ProblematicClass(ABCMeta, collections.Mapping):
    pass

isinstance(1, collections.Mapping)

导致错误:

  File "recreate_problem.py", line 29, in <module>
    isinstance(collections.Mapping, collections.Mapping)
  File "......Python-3.5.2/Lib/abc.py", line         191, in __instancecheck__
    return cls.__subclasscheck__(subclass)
  File ".../Python-3.5.2/Lib/abc.py", line     226, in __subclasscheck__
if issubclass(subclass, scls):
  File ".../Python-3.5.2/Lib/abc.py", line 225, in __subclasscheck__
    for scls in cls.__subclasses__():
TypeError: descriptor '__subclasses__' of 'type' object needs an argument

对于任何

都一样
isinstance(thing, collections.Mapping)

where事物不是collections.Mapping的实例(其中isinstance将返回false)。例如

isinstance({}, collections.Mapping)

照常工作。

这也会破坏许多调用isinstance(...,collections.Mapping)的库,例如pyplot和pandas,前提是它们在声明该类后在其他位置导入。

为什么会这样?

0 个答案:

没有答案