擅长:python、mysql、java
<p>扫描模块不是个好主意。如果需要类注册表,则应查看<a href="http://docs.python.org/reference/datamodel.html#customizing-class-creation" rel="nofollow noreferrer">metaclasses</a>或使用现有的解决方案,如<a href="http://pypi.python.org/pypi/zope.interface" rel="nofollow noreferrer">zope.interface</a>。
通过元类的简单解决方案可能如下所示:</p>
<pre><code>from functools import reduce
class DerivationRegistry(type):
def __init__(cls,name,bases,cls_dict):
type.__init__(cls,name,bases,cls_dict)
cls._subclasses = set()
for base in bases:
if isinstance(base,DerivationRegistry):
base._subclasses.add(cls)
def getSubclasses(cls):
return reduce( set.union,
( succ.getSubclasses() for succ in cls._subclasses if isinstance(succ,DerivationRegistry)),
cls._subclasses)
class Base(object):
__metaclass__ = DerivationRegistry
class Cls1(object):
pass
class Cls2(Base):
pass
class Cls3(Cls2,Cls1):
pass
class Cls4(Cls3):
pass
print(Base.getSubclasses())
</code></pre>