白云外贸型网站建设网络直接销售的营销方式
news/
2025/9/23 9:08:28/
文章来源:
白云外贸型网站建设,网络直接销售的营销方式,关键词排名点击软件推荐,企业邮箱免费登录入口Python类分为两种#xff0c;一种叫经典类#xff0c;一种叫新式类。都支持多继承#xff0c;但继承顺序不同。
新式类#xff1a;从object继承来的类。#xff08;如:class A(object)#xff09;#xff0c;采用广度优先搜索的方式继承#xff08;即先水平搜索#…Python类分为两种一种叫经典类一种叫新式类。都支持多继承但继承顺序不同。
新式类从object继承来的类。如:class A(object)采用广度优先搜索的方式继承即先水平搜索再向上搜索。经典类不从object继承来的类。如class A()采用深度优先搜索的方式继承即先深入继承树的左侧再返回再找右侧。 1、普通继承
子类中调用父类方法并不难下面是一个简单示例
class A:def __init__(self):self.attr_a 1print(执行A的初始化函数)class B(A):def __init__(self):A.__init__(self)self.attr_b 2b B()
print(b.attr_a, b.attr_b)
输出结果
执行A的初始化函数
1 2 2. 菱形继承
在子类中直接调用父类的方法虽然可行但在特定场景下会有问题比如菱形继承
class A:def __init__(self):self.attr_a 1print(执行A的初始化函数)class B(A):def __init__(self):A.__init__(self)self.attr_b 2print(执行B的初始化函数)class C(A):def __init__(self):A.__init__(self)self.attr_c 3print(执行C的初始化函数)class D(B, C):def __init__(self):B.__init__(self)C.__init__(self)self.attr_d 4print(执行D的初始化函数)d D()
print(d.attr_a, d.attr_b, d.attr_c, d.attr_d)A是B和C的父类D同时继承了B和C 这样就形成了菱形继承所谓菱形继承仅仅是因形状上像菱形。程序执行结果
执行A的初始化函数
执行B的初始化函数
执行A的初始化函数
执行C的初始化函数
执行D的初始化函数
1 2 3 4
应该注意到类A的初始化函数被执行了两次这是一个非常危险的行为如果A的初始化函数执行了一些一个进程中只能执行一次的代码这样的多进程就会导致严重的问题 super的引入就是为了解决这种问题。
class A:def __init__(self):self.attr_a 1print(执行A的初始化函数)class B(A):def __init__(self):super().__init__()self.attr_b 2print(执行B的初始化函数)class C(A):def __init__(self):super().__init__()self.attr_c 3print(执行C的初始化函数)class D(B, C):def __init__(self):super().__init__()self.attr_d 4print(执行D的初始化函数)d D()
print(d.attr_a, d.attr_b, d.attr_c, d.attr_d)执行结果
执行A的初始化函数
执行C的初始化函数
执行B的初始化函数
执行D的初始化函数
1 2 3 4
在D的初始化函数中只使用了一行代码super().__init__() 就将两个父类B和C的初始化函数都执行了 而且不会重复执行A的初始化函数这些都是super帮助我们完成的。
3. MRO
在第2小结的示例中 执行D的初始化函数使用了super会自动执行BC的初始化函数那么B与C的初始化函数先执行哪个呢对于这个问题在我们定义类时python会计算出一个方法解析顺序列表也就是MRO这个MRO列表就是一个简单的所有基类的线性顺序表, 类的mro()方法可以获得MRO
print(D.mro())输出结果
[class __main__.D, class __main__.B, class __main__.C, class __main__.A, class object]按照顺序先执行B的初始化函数在执行C的初始化函数最后执行A的初始化函数。
4. 带参数的super方法使用示例
为了简化代码前面的示例代码在执行super方法时都没有使用任何参数下面提供了有参数的示例
class A:def __init__(self):self.attr_a 1def add(self, a, b):return a bclass B(A):def __init__(self):super().__init__()self.attr_b 2def add(self, a, b):print(执行B的add)return a b 1class C(A):def __init__(self):super().__init__()self.attr_c 3def add(self, a, b):print(执行C的add)return a b 2class D(B, C):def __init__(self):super().__init__()self.attr_d 4def add(self, a, b):return super().add(a, b)d D()
print(d.add(1, 2))程序执行结果
执行B的add
4D的父类B和C都有add方法在D的add方法时super().add()会根据mro来决定调用哪个父类的add方法根据顺序应该执行B的add方法 如果你希望执行C的add方法, 那么可以这样来实现add方法
def add(self, a, b):return super(B, self).add(a, b)在mro列表里B的后面是C super的第一个函数指定为B 第二个参数设置为self就会执行C的add方法。
引文python面向对象--super() | 酷python
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911998.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!