QQ登录

只需一步,快速开始

开启左侧

Python学习第五十五天—类和对象4-构造函数、重写、钻石继承

[复制链接]
15271953841 发表于 2024-3-19 06:15:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 15271953841 于 2024-3-19 06:19 编辑

Python 3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
一、构造函数——定义类的同时定义构造函数,构造函数有一个特殊名称叫__init__()
class C:
    def __init__(self,x,y):
        self.x=x        (左边是x是绑定实例化对象中的x属性,右边x是传进来的x参数)
        self.y=y
    def add(self):
        return self.x + self.y
    def mul(self):
        return self.x * self.y

   
c=C(2,3)               (同时传入2个参数,我们在实例化的时候,就顺带着把对象的两个变量给安排进去了)
c.add()
5
c.mul()
6
c.__dict__             (内省一下)
{'x': 2, 'y': 3}
d=C(4,5)
d.__dict__
{'x': 4, 'y': 5}
d.add()
9
d.mul()
20
二、重写——子类对父类的重写
class D(C):              (定义一个类D,它是继承自类C的)
    def __init__(self,x,y,z):
        C.__init__(self,x,y)
        self.z=z
    def add(self):
        return C.add(self) + self.z
    def mul(self):
        return C.mul(self) * self.z

   
d=D(2,3,4)
d.add()
9
d.mul()
24
调用未绑定的父类方法:这种直接通过类名访问类里面的方法的作法,我们称之为“调用未绑定的父类方法”,会造成“钻石继承”的问题,也叫菱形继承。
三、钻石继承的问题
class A:
    def __init__(self):
        print("哈喽,我是A~")

        
class B1(A):
    def __init__(self):
        A.__init__(self)
        print("哈喽,我是B1~")

        
class B2(A):
    def __init__(self):
        A.__init__(self)
        print("哈喽,我是B2~")

        
class C(B1,B2):
    def __init__(self):
        B1.__init__(self)
        B2.__init__(self)
        print("哈喽,我是C~")

        
c=C()
哈喽,我是A~
哈喽,我是B1~
哈喽,我是A~          (A竟然出现了两次,解决方法就是调用super()函数)
哈喽,我是B2~
哈喽,我是C~
C.mro()
[<class '__main__.C'>, <class '__main__.B1'>, <class '__main__.B2'>, <class '__main__.A'>, <class 'object'>]
四、super()函数:能够在父类中搜索指定的方法,并自动绑定号self参数
class A:
    def __init__(self):
        print("哈喽,我是A~")

        
class B1(A):
    def __init__(self):
       super().__init__()
        print("哈喽,我是B1~")

        
class B2(A):
    def __init__(self):
       super().__init__()
        print("哈喽,我是B2~")

        
class C(B1,B2):
    def __init__(self):
        super().__init__()
        print("哈喽,我是C~")

        
c=C()
哈喽,我是A~
哈喽,我是B2~
哈喽,我是B1~
哈喽,我是C~
使用super()去查找父类的方法,它就会自动去按“MRO”(Method Resolution Order方法解析顺序)顺序去搜索父类的相关方法,并且自动避免重复调用的问题。
要查找一个类的MRO有两种方法,一种是通过MRO方法:

C.mro()
[<class '__main__.C'>, <class '__main__.B1'>, <class '__main__.B2'>, <class '__main__.A'>, <class 'object'>]
B1.mro()
[<class '__main__.B1'>, <class '__main__.A'>, <class 'object'>]
另外一种方法是通过MRO的属性,前后都有两个下划线。
C.__mro__
(<class '__main__.C'>, <class '__main__.B1'>, <class '__main__.B2'>, <class '__main__.A'>, <class 'object'>)
B2.__mro__
(<class '__main__.B2'>, <class '__main__.A'>, <class 'object'>)
这个就是类的方法解析顺序。在上面的例子中,类的继承关系如下:
Super()函数是依赖MRO顺序的。

                                    |——   B1  <——|     
object <—— A  <——|                          | <—— C            
                                    |——    B2 <——|   

客服热线
400-1234-888 周一至周日:09:00 - 21:00
公司地址:襄阳市樊城区长虹路现代城5号楼188

创客帮MAKER.BAND青少年创客创意社区是一个融教育、科技、体育资讯为一体的综合服务平台,专注于教育创新、专注于科技体育、专注于教育资讯。

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表