如何在python中定义类型"子类"?



在以下示例中,Plist1属性表示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'>]

子类-返回直接从该子类继承的类的弱引用列表。在此处输入链接描述

最新更新