马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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 <——|
|