擅长:python、mysql、java
<p>您可以让每个类维护自己的实例列表,方法是
它自己的<code>_registry</code>类属性。然后,不是检查每个
实例是一个特定的类,您可以迭代<code>_registry</code>中每个子类的<code>cls</code>的所有值。要找到这些子类,可以使用
<a href="https://docs.python.org/3/library/stdtypes.html#class.__subclasses__" rel="nofollow">^{<cd4>}</a>方法:</p>
<pre><code>import itertools as IT
class IterPartRegistry(type):
def __init__(cls, name, bases, attrs):
super(IterPartRegistry, cls).__init__(name, bases, attrs)
cls._registry = []
def __iter__(cls):
yield from cls._registry
for subcls in cls.__subclasses__():
yield from subcls
class A(object, metaclass=IterPartRegistry):
def __init__(self, name):
self.name = name
self._registry.append(self)
class B(A): pass
class C(A): pass
class D(B, C): pass
A("A - first")
B("B - first")
B("B - second")
C("C - first")
D("D - first")
for t in A:
print(t.name)
print(" - ")
for t in B:
print(t.name)
</code></pre>
<p>收益率</p>
^{pr2}$