Python递归固有

时间:2015-12-04 11:41:31

标签: python oop inheritance

我有一个基类,必须维护一个指向其子类的字典(这样我以后就可以动态地实例化它们)。

当然,每个子类都必须从基类继承。我面临的问题是,无论我先说出哪一个,都无法找到另一个。任何帮助表示赞赏?

class A(object):
    A_TYPES = {
        'B': B
    }

class B(A):
    pass

3 个答案:

答案 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__())

此索引是静态的,因此您只应在定义子类之后构建它。

在只跟踪某些子类的情况下,可能适合主动“注册”您感兴趣的那些(子)类。一种方法是通过装饰器应用于您想要注册的子类。但这超出了你所说的需要。