在以下示例中,P
的list1
属性表示a.的实例列表
class A:
value1: str
class B(A):
value2: str
class P:
list1: List[A]
我希望在变量list1
中保留A
的子类(而不是A
的实例(的列表。在python中有办法做到这一点吗?
解决方案是使用https://docs.python.org/3/library/typing.html#typing.Type.
from typing import List, Type
class P:
list1: List[Type[A]]
现在,list1
表示从a.扩展的类的列表
我尝试从第一个答案复制到这里:如何找到给定名称的类的所有子类?:
class klass():
pass
class popo(klass):
pass
class pepe(klass):
pass
class P():
def get_all_subclasses(self, cls):
subclass_list = []
def recurse(classe):
for subclass in classe.__subclasses__():
subclass_list.append(subclass)
recurse(subclass)
recurse(cls)
return list(set(subclass_list))
a = P()
print(a.get_all_subclasses(klass),'n')
print(type(a.get_all_subclasses(klass)),'n')
class papa(klass):
pass
class coco(popo):
pass
print(a.get_all_subclasses(klass),'n')
输出:
[<class '__main__.popo'>, <class '__main__.pepe'>]
<class 'list'>
[<class '__main__.papa'>, <class '__main__.popo'>, <class '__main__.pepe'>, <class '__main__.coco'>]
或:
class klass:
pass
class popo(klass):
pass
class pepe(klass):
pass
class P:
def __init__(self, classez):
self.list1 = []
self.get_all_subclasses(classez)
pass
def get_all_subclasses(self, cls):
def recurse(classe):
for subclass in classe.__subclasses__():
self.list1.append(subclass)
recurse(subclass) # necessarioo per avere coco nella lista
recurse(cls)
self.list1 = list((self.list1))
return self.list1
a = P(klass)
print(a.list1, "n")
print(type(a.list1), "n")
class papa(klass):
pass
class coco(popo):
pass
a = P(klass)
print(a.list1)
我也明白:
[<class '__main__.popo'>, <class '__main__.pepe'>]
<class 'list'>
[<class '__main__.popo'>, <class '__main__.coco'>, <class '__main__.pepe'>, <class '__main__.papa'>]
使用:
class klass():
pass
class popo(klass):
pass
class pepe(klass):
pass
print(klass.__subclasses__(),'n')
class papa(klass):
pass
class coco(popo):
pass
print(klass.__subclasses__(),'n')
我得到:
[<class '__main__.popo'>, <class '__main__.pepe'>]
[<class '__main__.popo'>, <class '__main__.pepe'>, <class '__main__.papa'>]
...
class P:
A.__subclasses__()
>>> [<class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>]
子类-返回直接从该子类继承的类的弱引用列表。在此处输入链接描述