作者:真理往往是废话 | 来源:互联网 | 2023-01-30 19:31
给定这样的类结构:
class A:
dependencies = ["x", "y"]
class B(A):
dependencies = ["z"]
class C(A):
dependencies = ["n", "m"]
class D(C):
dependencies = ["o"]
我想知道是否有可能编写一个函数(最好是生活在A类),这些函数沿着这些方向做了一些事情:
@classmethod
def get_all_dependencies(cls):
return super().get_all_dependencies() + cls.dependencies
对于上述类,预期输出将是:
>>> A.get_all_dependencies():
["x", "y"]
>>> B.get_all_dependencies():
["x", "y", "z"]
>>> C.get_all_dependencies():
["x", "y", "n", "m"]
>>> D.get_all_dependencies():
["x", "y", "n", "m", "o"]
显然上面的代码不起作用 - 它只返回dependencies
我调用它的类.我不确定如何让它在所有类中递归工作?(我正在hasattr
检查以确保父类调用get_all_dependencies()
.)
1> Jim Fasaraki..:
走了mro
,抓住依赖是我要做的:
@classmethod
def get_dep(cls):
return [d for c in cls.mro()[:-1] for d in getattr(c, 'dependencies')]
与cls.mro()[:-1]
被用来排除object
.
返回:
>>> A.get_dep()
['x', 'y']
>>> B.get_dep()
['z', 'x', 'y']
>>> C.get_dep()
['n', 'm', 'x', 'y']
>>> D.get_dep()
['o', 'n', 'm', 'x', 'y']