我是 python OOP 新手。
我遇到了一个无法独自解决的问题,即使在互联网上咨询了几个小时后,我也距离解决方案还没有迈出一步。
我有一个线性类层次结构,其中类继承父类。
例如:
class Animal:
food = "everything"
class Carnivore(Animal) :
food = "flesh"
class Wolf(Carnivore) :
food = "big animals"
class Dog(Wolf) :
food = "dog food"
非常简单。每个类都继承自另一个类,并且具有相同的属性,每次都会被覆盖。
现在我想要一个函数来获取食物的所有值。
这个函数应该是递归的。 我正在考虑这样的事情:
def get_food(self) :
print(self.food)
super().get_food()
然后可以这样调用:
Dog.get_food()
问题是,使用该函数的实例永远不会改变。这意味着我总是会得到“狗粮”作为答案。
有没有办法用一个函数迭代所有父类并获取它们的属性?
我不希望在所有类中使用如下语句编写相同的函数:
print(Wolf.food)
为了更容易维护。
非常感谢您的帮助或建议。
编辑:
通话的预期结果:
Dog.get_food()
将是:
dog food
big animals
flesh
everything
最佳答案
希望我正确理解了您想要做什么。
我知道如何做到这一点的唯一方法确实很棘手,你必须深入了解 python 的内部。您必须使用Method Resolution Order .
但要小心,MRO 在更复杂的示例中可能会变得非常棘手,我不建议在生产代码中这样做。但所有这些都表明这是一件很酷的事情。
这段代码的作用本质上是循环遍历您继承的所有类并打印出该类的 food 属性。
class Animal:
food = "everything"
def get_food(self):
for _class in self.__class__.__mro__[:-1]:
print(_class.food)
...
class Dog(Wolf):
food = "dog food"
d = Dog()
d.get_food()
请注意,我们不会循环访问 MRO 中的最后一个类,因为它是通用对象类,并且没有 food 属性。
输出:
dog food
big animals
flesh
everything
关于python - 动态继承功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73485926/