Python递归固有

2024-04-24 02:56:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当然,每个子类都必须从基类继承。我面临的问题是,无论我先声明哪个,都找不到另一个。有什么需要帮忙的吗

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

class B(A):
    pass

Tags: 实例声明字典object动态pass基类子类
3条回答

如果您只需要一个所有子类的列表,那么您可以获得一个带有cls.__subsclasses__()的总是当前的列表,正如@DanielRoseman所写的。你想查他们的名字吗?没问题,自己建立一个索引:

class A:
    pass

class B(A):
    pass

...

A.subclass_index = dict((sub.__name__, sub) for sub in A.__subclasses__())

这个索引是静态的,所以您应该只在定义了子类之后构建它

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

我不知道为什么需要在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'}

类已经维护了它们的子类列表,可以通过__subclasses__()方法获得

相关问题 更多 >