python abc子类钩子在派生类时不起作用
当类是从具有python abc子类钩子在派生类时不起作用,python,python-3.x,abc,Python,Python 3.x,Abc,当类是从具有\uuuuu\uuuu实现的类派生时,无法从issubclass返回False。我修改了以下代码: 我只在两个类定义中添加了“(Sized)”: from abc import ABCMeta class Sized(metaclass=ABCMeta): @classmethod def __subclasshook__(cls, C): if cls is Sized: if any("__len__" in B.__di
\uuuuu\uuuu
实现的类派生时,无法从issubclass返回False
。我修改了以下代码:
我只在两个类定义中添加了“(Sized)”:
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
?或者可能我做错了什么?问题是当\uuuu子类hook\uuu
没有提前退出时,返回NotImplemented
。并如以下文件所述:
如果返回NotImplemented,子类检查将继续使用通常的机制
因此,它使用普通的子类检查,并发现您实际上继承了size
,因此返回True
有两种解决方案:
返回False
而不是返回NotImplemented
。但是,是否确实希望/需要issubclass
为直接子类返回False
A
和B
的object
继承,它将按预期工作:
class A(object):
pass
class B(object):
def __len__(self):
return 0
print(issubclass(A, Sized)) # False
print(issubclass(B, Sized)) # True
问题是当
\uuuu子类hook\uuuu
没有提前退出时,返回NotImplemented
。并如以下文件所述:
如果返回NotImplemented,子类检查将继续使用通常的机制
因此,它使用普通的子类检查,并发现您实际上继承了size
,因此返回True
有两种解决方案:
返回False
而不是返回NotImplemented
。但是,是否确实希望/需要issubclass
为直接子类返回False
A
和B
的object
继承,它将按预期工作:
class A(object):
pass
class B(object):
def __len__(self):
return 0
print(issubclass(A, Sized)) # False
print(issubclass(B, Sized)) # True
我认为实现这一点的好方法是:
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
else:
return False
return NotImplemented
class A(Sized):
pass
class B(Sized):
def __len__(self):
return 0
print(issubclass(A, Sized)) # False
print(issubclass(B, Sized)) # True
我认为,当我们假设abc的机制类似于其他语言中的编译(或反射)时,我们应该返回False。如果有人怀疑这个类是正确的子类,那么代码就不应该运行,甚至不应该编译(不是用python) 我认为实现这一点的好方法是:
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
else:
return False
return NotImplemented
class A(Sized):
pass
class B(Sized):
def __len__(self):
return 0
print(issubclass(A, Sized)) # False
print(issubclass(B, Sized)) # True
我认为,当我们假设abc的机制类似于其他语言中的编译(或反射)时,我们应该返回False。如果有人怀疑这个类是正确的子类,那么代码就不应该运行,甚至不应该编译(不是用python) 当然,我发现代码片段(在abc中)的开头是:
ok=cls.\uuu子类hook.\uuu(子类)
如果我遗漏了什么,请原谅,但是你不能用返回False
来替换返回未实现的
?《政治公众人物》第八章中有你想要坚持的东西吗?@leaf:谢谢你,这太明显了。但是为什么所有的例子都只返回True
或NotImplemented
。我相信这是因为[Python]()标准在实现时调用了“神奇的方法”。当然,我发现代码片段(在abc中)以:ok=cls.\uuu subclass钩子(subclass)
开头,但是,您能否将返回未实现的
替换为返回错误
?《政治公众人物》第八章中有你想要坚持的东西吗?@leaf:谢谢你,这太明显了。但是为什么所有的例子都只返回True
或NotImplemented
。我相信这是因为[Python]()标准在实现“神奇方法”时所要求的。是的,假设该机制类似于其他语言中的编译(或反射)。如果有人怀疑这个类是正确的子类,那么代码就不应该运行,甚至不应该编译(不是用python)。公元2年。我明白了,这是link.ad1的代码。是的,假设该机制类似于其他语言中的编译(或反射)。如果有人怀疑这个类是正确的子类,那么代码就不应该运行,甚至不应该编译(不是用python)。公元2年。我理解,这是链接中的代码。请不要只是转储代码,解释为什么这可以解决问题。否则,你可能还想考虑我的答案,它也包含相关的信息+解释。请不要仅仅转储代码,解释为什么这能解决问题。否则你可能还想考虑我的答案,里面还包含了相关的信息+解释。