【问题标题】:Abstract class Container - Python抽象类容器 - Python
【发布时间】:2021-12-18 09:36:55
【问题描述】:

我试图理解为什么任何具有__contains__ 方法的类都会成为Container 抽象类的实例。我有点困惑,因为正确的方法应该是这样的 class dumb(Container): 并定义自己的 __contains__ 方法。

应该是因为鸭子打字,但是鸭子在那里打字呢?

【问题讨论】:

    标签: python oop abstract-class duck-typing built-in-types


    【解决方案1】:

    类可以通过实现__subclasshook__ 来自定义isinstance 检查。 许多类会选择查看实例的属性来确定类型,而不是依赖继承层次结构

    例如,this is how Container is implemented

    class Container(metaclass=ABCMeta):
    
        __slots__ = ()
    
        @abstractmethod
        def __contains__(self, x):
            return False
    
        @classmethod
        def __subclasshook__(cls, C):
            if cls is Container:
                return _check_methods(C, "__contains__")
            return NotImplemented
    
        __class_getitem__ = classmethod(GenericAlias) ```
    

    【讨论】:

    • 所以鸭子类型是在具有 '__contains__' 方法的新类上。我的意思是,它有方法,所以它必须是一个容器。感谢您的回答,对我完全理解有很大帮助。
    【解决方案2】:

    如果它走路像鸭子,叫起来像鸭子,那么它一定是鸭子。

    Duck 类型的想法是,在某些情况下,对象可以通过其功能而不是其类名称来定义。通过包含__contains__ 方法,意味着该对象充当容器。

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 2019-10-23
      • 2018-02-06
      • 2014-02-02
      • 2021-10-24
      • 2021-12-31
      相关资源
      最近更新 更多