我有一个基类,必须维护一个指向其子类的字典(这样我以后就可以动态地实例化它们)。
当然,每个子类都必须从基类继承。我面临的问题是,无论我先说出哪一个,都无法找到另一个。任何帮助表示赞赏?
class A(object):
A_TYPES = {
'B': B
}
class B(A):
pass
答案 0 :(得分:0)
类已经维护了一个子类列表,可以通过__subclasses__()
方法获得。
答案 1 :(得分:0)
我不确定为什么你需要在A
类中维护这些数据,但无论如何......
您可以在定义所有子类后将A_TYPES
类属性添加到A
:
class A(object):
pass
class B(A):
pass
class C(A):
pass
A.A_TYPES = {'B': B, 'C': C}
当然,任何这些类的任何实例都可以访问(和更新).A_TYPES
。例如,
inst = C()
inst.A_TYPES.update({'F': 'fake'})
print A.A_TYPES
<强>输出强>
{'C': <class '__main__.C'>, 'B': <class '__main__.B'>, 'F': 'fake'}
答案 2 :(得分:0)
如果你只想要一个所有子类的列表,你可以获得一个带有cls.__subsclasses__()
的永远当前列表,如@DanielRoseman所写。你希望能够通过名字查找它们吗?没问题,只需自己建立一个索引:
class A:
pass
class B(A):
pass
...
A.subclass_index = dict((sub.__name__, sub) for sub in A.__subclasses__())
此索引是静态的,因此您只应在定义子类之后构建它。
在只跟踪某些子类的情况下,可能适合主动“注册”您感兴趣的那些(子)类。一种方法是通过装饰器应用于您想要注册的子类。但这超出了你所说的需要。