擅长:python、mysql、java
<p><a href="https://docs.python.org/3/library/abc.html#abc.ABCMeta.__subclasshook__" rel="nofollow noreferrer">^{<cd1>}</a>和<a href="https://docs.python.org/3/reference/datamodel.html?#class.__subclasscheck__" rel="nofollow noreferrer">^{<cd2>}</a>用于自定义<code>issubclass</code>函数的行为。
更多信息请参见<a href="https://hg.python.org/cpython/file/3.5/Lib/abc.py#l194" rel="nofollow noreferrer">abc source code</a>。</p>
<p><code>__subclasscheck__</code>查找类的类型(元类)。它不应该为普通类定义。</p>
<p><code>__subclasshook__</code>检查子类是否被视为某些ABC的子类。这意味着您可以进一步定制<code>issubclass</code>的行为,而无需对要考虑ABC的子类的每个类调用register()。</p>
<p>这意味着您可以用一些条件在ABC类中定义<code>__subclasshook__</code>,并且满足该条件的所有类都将作为子类考虑。</p>
<p>例如:</p>
<pre><code>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(object):
pass
class B(object):
def __len__(self):
return 0
issubclass(A, Sized) # False
issubclass(B, Sized) # True
</code></pre>