第7.22节 Python中使用super调用父类的方法

第7.22节 Python中使用super调用父类的方法

前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的。由于super方法的特殊性,本节单独谈一谈super方法。
一、super简介
1.        super方法返回一个“super”类型的对象,注意是一个新的类型,并不是父类;
2.    使用“super().方法名”调用并不是用于直接调用当前类的父类的方法,而是Python根据MRO算法去所有父类中查找找到的第一个与“方法名”同名的某个父类方法,因此如果某子类继承多个超类、或某子类有多个层级的超类时,这些超类中有多个同名的方法时,只会执行一次;
3.    在多重继承情况下,使用在类内使用“super().方法名”调用时,不一定是调用上一层的超类的方法,也可能是超类的超类的方法。

三、    使用super的优点
1.    超类类名修改之后,不需要在所有子类中进行类名修改;
2.    在单继承中 super 用来调用父类的方法的,多重继承情况下可以使用super解决多个同名方法执行谁的问题,在super机制里可以保证公共父类的方法仅被执行一次,至于执行的顺序,是按照MRO进行的。
四、    super的使用
1.    通过super方法无需传递self参数,是因为super这个方法执行时,Python会自动将当前类和当前实例作为super的参数,调用后返回的是一个super对象;
2.    调用父类方法 时, 此时父类中 self 并不是父类的实例而是子类的实例;
3.    super类体内实例方法调用时,直接调用super方法,无需带任何参数。这是因为super类型本身是个类,在调用super()时,实际上会执行这个类的构造函数,这个构造函数要求同时传入参数子类名和当前实例名,在实例方法中Python自动地传入这两个参数;
4.    在类体外调用时,可以通过”super(类名,实例名)”方式调用super;
5.    在类内定义时,“super().方法名”、“超类名.方法名()”两种调用方式不要混用,因为二者搜索“方法名”对应的算法不同,可能会导致编程人员无法预测的结果。五、    一个例子

#抽象类虚拟子类及super方法样例
def dirp(iter): return [i for i in dir(iter) if not i.startswith('__')]
from abc import ABC, abstractmethod
class Shape(ABC):
    @abstractmethod
    def getArea(self):pass  #定义获取面积的抽象方法
    def __init__(self,area): #定义shape的构造方法
        print("In ShapeInit")
        self.area1=area  #定义基类的实例变量area1,子类中直接继承
    def getArea2(self):return self.area1 #定义getArea2方法,该方法有抽象基类实现,子类继承
    
class Output(ABC):    
    def __init__(self):
        print("In OutputInit")
    
    @abstractmethod
    def output(self):print(dirp(self))#输出实例自定义属性
     
class Circle(Shape,Output):
    def __init__(self,radius):
        super().__init__(9) #调用超类方法的构造函数
        self.radius = radius
        self.area = 3.14*self.radius*self.radius
        self.girth = 6.28*self.radius 
    def getArea(self): return self.area
    def getGirth(self):return self.girth
    def output(self): #输出实例的内容
        print("area={:.2f},girth={:.2f}".format(self.area,self.girth))
        super().output()

cir=Circle(10)
cir.getArea2()


执行截图:
 
六、    参考知识
super涉及到的MRO算法以及一些更深入的内容,请大家参考如下博文:
https://www.jb51.net/article/87807.htm
https://www.jb51.net/article/66912.htm
https://www.cnblogs.com/xinghuaikang/p/8481712.html

本节介绍了super方法访问超类方法的原理和使用方法,并介绍了三个进一步深入了解super的博文。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
 

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
抱歉,我无法回答第一个问题。 但是,我能够指导你如何运用Python语言实现这个问题的操作。 1. 创建Person class ``` class Person: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def personInfo(self): print("姓名:%s,年龄:%d,性别:%s" % (self.name, self.age, self.gender)) ``` 2. 创建Student class,继承自Person class,重写personInfo()方法,添加学生的college和stu_class属性以及learn()方法。 ``` class Student(Person): def __init__(self, name, age, gender, college, stu_class): super().__init__(name, age, gender) self.college = college self.stu_class = stu_class def personInfo(self): super().personInfo() print("所在学院:%s,班级:%s" % (self.college, self.stu_class)) def learn(self, teacher): knowledge = teacher.teach() print("老师%s,我终于学会了%s!" % (teacher.name, knowledge)) def __str__(self): return "姓名:%s,年龄:%d,性别:%s,所在学院:%s,班级:%s" % (self.name, self.age, self.gender, self.college, self.stu_class) ``` 3. 创建Teacher class,继承自Person class,添加学院college和专业major属性以及teach()方法。 ``` class Teacher(Person): def __init__(self, name, age, gender, college, major): super().__init__(name, age, gender) self.college = college self.major = major def personInfo(self): super().personInfo() print("教学院校:%s,所授专业:%s" % (self.college, self.major)) def teach(self): return "如何用面向对象设计程序" def __str__(self): return "姓名:%s,年龄:%d,性别:%s,教学院校:%s,所授专业:%s" % (self.name, self.age, self.gender, self.college, self.major) ``` 4. 创建三个学生对象并打印详细信息。 ``` student1 = Student("张三", 20, "男", "计算机科学与技术", "A班") student1.personInfo() print(student1) student2 = Student("李四", 21, "女", "软件工程", "B班") student2.personInfo() print(student2) student3 = Student("王五", 19, "男", "信息安全", "C班") student3.personInfo() print(student3) ``` 5. 创建一个老师对象并打印详细信息。 ``` teacher = Teacher("赵六", 35, "男", "计算机科学与技术", "软件工程") teacher.personInfo() print(teacher) ``` 6. 学生对象调用learn方法。 ``` student1.learn(teacher) student2.learn(teacher) student3.learn(teacher) ``` 7. 将三个学生对象添加至列表,通过循环将列表的对象打印出来。 ``` students = [student1, student2, student3] for student in students: print(student)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值