当类从具有__subclashook__
实现的类派生时,无法从issubclass返回False
。我修改的代码来自:
python subclasscheck & subclasshook
我只在两个类定义中添加了“(size)”:
from abc import ABCMeta
class Sized(metaclass=ABCMeta):
@classmethod
def __subclasshook__(cls, C):
if cls is Sized:
if any("__len__" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented
class A(Sized):
pass
class B(Sized):
def __len__(self):
return 0
print(issubclass(A, Sized)) # True - should be False
print(issubclass(B, Sized)) # True
在这种情况下有没有办法返回False
?或者我做错了什么?在
问题是当
__subclasshook__
没有提前退出时,return NotImplemented
。如documentation所述:所以它使用正常的子类检查,发现您确实继承了
Sized
,因此返回True
。在有两种解决方案:
return False
而不是return NotImplemented
。但是,您真的想要/需要issubclass
为直接子类返回False
?如果从
object
继承类A
和B
的类,它将按预期工作:我认为实现这一点的好方法是:
我认为当我们假设
abc
是与其他语言中的编译(或反射)类似的机制时,我们应该返回False。如果有人怀疑这个类是正确的子类,那么代码就不应该运行,甚至不应该编译(python中没有)。在相关问题 更多 >
编程相关推荐