<p>类已经注册了定义的子类;调用<a href="http://docs.python.org/2/library/stdtypes.html#class.__subclasses__" rel="nofollow noreferrer">^{<cd1>} method</a>获取列表:</p>
<pre><code>>>> class Monster(object):
... pass
...
>>> class Lochness(Monster):
... pass
...
>>> class Yeti(Monster):
... pass
...
>>> Monster.__subclasses__()
[<class '__main__.Lochness'>, <class '__main__.Yeti'>]
</code></pre>
<p><code>.__subclasses__()</code>返回当前仍在活动的<em>子类的列表。当你不再调用cd4{d>中的所有引用时,{cd4}将不再调用<cd3}中的所有引用。注意,本质上,<code>.__subclasses__()</code>是一个<a href="http://mail.python.org/pipermail/python-list/2003-August/210297.html" rel="nofollow noreferrer">CPython implementation detail</a>,但该方法存在于所有支持新样式类的Python版本中(2.2及更高版本,一直到3.x)。在</p>
<p>否则,钩住类创建的规范方法是定义一个<a href="https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python">metaclass</a>:</p>
^{pr2}$
<p>演示:</p>
^{3}$
<p>或者您可以使用<a href="https://stackoverflow.com/questions/681953/python-class-decorator">class decorator</a>:</p>
<pre><code>def registered_monster(cls):
Monster.monsters.append(cls)
return cls
class Monster(object):
monsters = []
@registered_monster
class Lochness(Monster):
pass
@registered_monster
class Yeti(Monster):
pass
</code></pre>
<p>演示:</p>
<pre><code>>>> class Monster(object):
... monsters = []
...
>>> @registered_monster
... class Lochness(Monster):
... pass
...
>>> @registered_monster
... class Yeti(Monster):
... pass
...
>>> Monster.monsters
[<class '__main__.Lochness'>, <class '__main__.Yeti'>]
</code></pre>
<p>不同之处在于,注册怪物的职责是:使用基<code>MonstersMeta</code>类型,还是显式修饰符。在</p>
<p>不管怎样,元类或类装饰器注册一个永久引用。如果您真的非常想模拟<code>.__subclasses__()</code>行为,可以使用<a href="http://docs.python.org/2/library/weakref.html" rel="nofollow noreferrer">^{<cd8>} module</a>。在</p>