gpt4 book ai didi

python - 如何知道父类的所有派生类?

转载 作者:IT老高 更新时间:2023-10-28 20:54:14 25 4
gpt4 key购买 nike

假设您有一个基类 A,并且该类由 B 和 C 重新实现。假设还有一个类方法 A.derived() 告诉你哪些类正在重新实现 A,因此返回 [B, C],如果你以后有 class D(A): passclass D(B): pass,现在 A.derived() 返回 [B,C,D]。

您将如何实现 A.derived() 方法?我有一种感觉,除非您使用元类,否则这是不可能的。您只能使用标准机制从子级到父级遍历继承树。要获得另一个方向的链接,您必须“手动”保留它,这意味着覆盖传统的类声明机制。

最佳答案

如果您将类定义为新样式类(object 的子类),那么这是可能的,因为子类保存在 __subclasses__ 中。

class A(object):
def hello(self):
print "Hello A"

class B(A):
def hello(self):
print "Hello B"

>>> for cls in A.__subclasses__():
... print cls.__name__
...
B

我不知道这是什么时候引入的,或者是否有任何特殊考虑。但是,在函数中声明子类确实可以正常工作:

>>> def f(x):
... class C(A):
... def hello(self):
... print "Hello C"
... c = C()
... c.hello()
... print x
... for cls in A.__subclasses__():
... print cls.__name__
...
>>> f(4)
Hello C
4
B
C

但是,您需要注意,在运行类定义之前,解释器并不知道它们。在上面的例子中,直到函数 f 被执行,C 才被识别为 A 的子类。但这对 python 类来说每次都是一样的,我想你已经知道了。

关于python - 如何知道父类的所有派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2219998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com