【问题标题】:How to define type 'a child class of' in python?如何在python中定义类型“子类”?
【发布时间】:2022-01-09 08:44:20
【问题描述】:

在以下示例中,Plist1 属性表示 A 的实例列表。

class A:
   value1: str

class B(A):
   value2: str

class P:
   list1: List[A]

我想要在变量list1 中保留A 的子类列表(不是A 的实例)。有没有办法在python中做到这一点?

【问题讨论】:

标签: python python-3.x class inheritance types


【解决方案1】:

我尝试从这里的第一个答案复制:How to find all the subclasses of a class given its name?

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'>] 

【讨论】:

【解决方案2】:

解决方法是使用https://docs.python.org/3/library/typing.html#typing.Type

from typing import List, Type

class P:
   list1: List[Type[A]]

现在,list1 表示从 A 扩展的类列表。

【讨论】:

  • 抱歉打扰我是 python 新手,但是你的变量注释看起来像函数注释吗?在这里他们以不同的方式显示它们:python.org/dev/peps/pep-0526。也许我需要更好地弄清楚
【解决方案3】:
...
class P:
    A.__subclasses__()

>>> [<class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>]

子类 - 返回对直接继承自该类的类的弱引用列表。 enter link description here

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多