摘要 class 容器 - Python
Abstract class Container - Python
我试图理解为什么任何具有 __contains__
方法的 class 成为容器抽象 class 的实例。我有点困惑,因为正确的方法应该是这样 class dumb(Container):
并定义你自己的 __contains__
方法。
应该是因为鸭子打字但是鸭子打字在哪里?
类 能够通过实施 __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) ```
如果它走路像鸭子,叫起来像鸭子,那它一定是鸭子
鸭子类型是指在某些情况下,对象可以通过其功能而不是其 class 名称来定义。通过包含 __contains__
方法,意味着该对象充当容器。
我试图理解为什么任何具有 __contains__
方法的 class 成为容器抽象 class 的实例。我有点困惑,因为正确的方法应该是这样 class dumb(Container):
并定义你自己的 __contains__
方法。
应该是因为鸭子打字但是鸭子打字在哪里?
类 能够通过实施 __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) ```
如果它走路像鸭子,叫起来像鸭子,那它一定是鸭子
鸭子类型是指在某些情况下,对象可以通过其功能而不是其 class 名称来定义。通过包含 __contains__
方法,意味着该对象充当容器。