我上过class节的Python编程,我在这里感到困惑.

我知道super是用来调用parent类的方法的,但这里Employee不是Programmer的父类,显示getLanguage方法的结果.

我错过了什么?

这就是密码.

class Employee:
    company= "Google"
    language = "java"
    def showDetails(self):
        print("This is an employee");

    def getLanguage(self):
        print(f"1. The language is {self.language}");


class Programmer:
    language= "Python"
    company = "Youtubeeee"
    def getLanguage(self):
        super().getLanguage();
        print(f"2. The language is {self.language}")

    def showDetails(self):
        print("This is an programmer")



class Programmer2(Programmer , Employee):
    language= "C++"
    def getLanguage(self):
        super().getLanguage();
        print(f"3. The language is {self.language}")



p2 = Programmer2();
p2.getLanguage();

这是输出,

1. The language is C++
2. The language is C++
3. The language is C++

推荐答案

你遇到了super存在的原因之一.从doctor 那里,super delegates method calls to a parent or sibling class of type.Python以动态Method Resolution Order (MRO)为基础进行类继承.当您创建具有多个继承的类时,这两个父类成为sibling 类.在MRO中,最左边的是第一个,右边是第二个.

这不是Programmer类的属性,而是决定进行多重继承的Programmer2类的属性.如果以不同的方式使用Programmer,例如,

p3 = Programmer()
p3.getLanguage()

您得到错误AttributeError: 'super' object has no attribute 'getLanguage',因为它的MRO只到达没有该方法的基本object.

您可以查看具有__mro__属性的类的MRO.

Programmer.__mro__:
    (<class '__main__.Programmer'>, <class 'object'>)

Programmer2.__mro__:
    (<class '__main__.Programmer2'>, <class '__main__.Programmer'>, 
    <class '__main__.Employee'>, <class 'object'>)

Python相关问答推荐

Pandas 第二小值有条件

我从带有langchain的mongoDB中的vector serch获得一个空数组

numba jitClass,记录类型为字符串

如何避免Chained when/then分配中的Mypy不兼容类型警告?

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

pyscript中的压痕问题

如果条件不满足,我如何获得掩码的第一个索引并获得None?

我对我应该做什么以及我如何做感到困惑'

计算每个IP的平均值

如何从列表框中 Select 而不出错?

在pandas/python中计数嵌套类别

从列表中获取n个元素,其中list [i][0]== value''

如果有2个或3个,则从pandas列中删除空格

如何在Airflow执行日期中保留日期并将时间转换为00:00

利用SCIPY沿第一轴对数组进行内插

我如何处理超类和子类的情况

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?

将标签与山脊线图对齐

如何使用Polars从AWS S3读取镶木地板文件

如何将参数名作为参数传入到函数中?