【发布时间】:2021-12-18 09:36:55
【问题描述】:
我试图理解为什么任何具有__contains__ 方法的类都会成为Container 抽象类的实例。我有点困惑,因为正确的方法应该是这样的 class dumb(Container): 并定义自己的 __contains__ 方法。
应该是因为鸭子打字,但是鸭子在那里打字呢?
【问题讨论】:
标签: python oop abstract-class duck-typing built-in-types
我试图理解为什么任何具有__contains__ 方法的类都会成为Container 抽象类的实例。我有点困惑,因为正确的方法应该是这样的 class dumb(Container): 并定义自己的 __contains__ 方法。
应该是因为鸭子打字,但是鸭子在那里打字呢?
【问题讨论】:
标签: python oop abstract-class duck-typing built-in-types
类可以通过实现__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) ```
【讨论】:
如果它走路像鸭子,叫起来像鸭子,那么它一定是鸭子。
Duck 类型的想法是,在某些情况下,对象可以通过其功能而不是其类名称来定义。通过包含__contains__ 方法,意味着该对象充当容器。
【讨论】: