Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python abc子类钩子在派生类时不起作用_Python_Python 3.x_Abc - Fatal编程技术网

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年。我理解,这是链接中的代码。请不要只是转储代码,解释为什么这可以解决问题。否则,你可能还想考虑我的答案,它也包含相关的信息+解释。请不要仅仅转储代码,解释为什么这能解决问题。否则你可能还想考虑我的答案,里面还包含了相关的信息+解释。