python - 动态继承功能

标签 python oop recursion inheritance

我是 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/

相关文章:

python - 如何读取缺少值和 'delim_whitespace=True'的csv文件?

python - 使用python将elasticsearch编辑为表

python - Gekko 优化以获得不同问题的评分

javascript - jQuery 中的对象

Python:在功能上合并两个迭代器,其中一个迭代器是递归的

python - 如何使用私有(private) Azure Artifact 依赖项运行 Python Azure Function

javascript - 对象方法无法访问 ES6 JavaScript 对象的计算属性

java - 存储对不同类的对象的引用

c++ - 使用 RapidXML/C++ 类指针副作用进行解析时的递归问题

c - C 编程语言中的递归