2024-04-24 02:56:00 发布
网友
我有一个基类,它必须维护一个指向它的子类的字典(这样我以后就可以动态地实例化它们)
当然,每个子类都必须从基类继承。我面临的问题是,无论我先声明哪个,都找不到另一个。有什么需要帮忙的吗
class A(object): A_TYPES = { 'B': B } class B(A): pass
如果您只需要一个所有子类的列表,那么您可以获得一个带有cls.__subsclasses__()的总是当前的列表,正如@DanielRoseman所写的。你想查他们的名字吗?没问题,自己建立一个索引:
cls.__subsclasses__()
class A: pass class B(A): pass ... A.subclass_index = dict((sub.__name__, sub) for sub in A.__subclasses__())
这个索引是静态的,所以您应该只在定义了子类之后构建它
在只需要跟踪某些子类的情况下,可以主动“注册”您感兴趣的那些(子)类。一种方法是通过一个decorator应用于那些你想要注册的子类。但这超出了你所说的你需要的
我不知道为什么需要在A类中维护这些数据,但是无论如何
A
定义完所有子类后,可以将A_TYPES类属性添加到A:
A_TYPES
class A(object): pass class B(A): pass class C(A): pass A.A_TYPES = {'B': B, 'C': C}
当然,这些类的任何实例都可以访问(和更新).A_TYPES。例如
.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__()方法获得
__subclasses__()
如果您只需要一个所有子类的列表,那么您可以获得一个带有
cls.__subsclasses__()
的总是当前的列表,正如@DanielRoseman所写的。你想查他们的名字吗?没问题,自己建立一个索引:这个索引是静态的,所以您应该只在定义了子类之后构建它
在只需要跟踪某些子类的情况下,可以主动“注册”您感兴趣的那些(子)类。一种方法是通过一个decorator应用于那些你想要注册的子类。但这超出了你所说的你需要的
我不知道为什么需要在
A
类中维护这些数据,但是无论如何定义完所有子类后,可以将
A_TYPES
类属性添加到A
:当然,这些类的任何实例都可以访问(和更新)
.A_TYPES
。例如输出
类已经维护了它们的子类列表,可以通过
__subclasses__()
方法获得相关问题 更多 >
编程相关推荐