首页 > 编程语言 > 详细

[python]面向对象三大基本特性---继承

时间:2020-04-24 22:35:59      阅读:63      评论:0      收藏:0      [点我收藏+]
继承:子类需要复用父类里面的属性或者方法,子类也可以提供自己的属性和方法
多重继承:

Python中子类调用父类的方法有两种方法能够实现:调用父类构造方法,或者使用super函数(两者不要混用)。

继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance )。
私有的属性、方法,不会被子类继承,也不能被访问
一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用

在Python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类
可以在类名的()后边添加多个类,来实现多重继承
多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法
在开发中没有特殊的情况,应该尽量避免使用多重继承,因为多重继承会让我们的代码过于复杂
如果多个父类中有同名的方法,则会现在第一个父类中寻找,然后找第二个,然后找第三个.....
前边父类的方法会覆盖后边父类的方法


旧算法的MRO推导算法很直观,它使用树状结构组织类。当函数调来到来的时候从左往右的使用深度优先遍历父类:
1,检查对象是否实现了方法
2,如果没有找到,检查首个父类是否实现了该方法
3,如果没有找到,检查本类是否还继承了其他类,是的话从其他分支向上追溯

 

class A(object):
def __init__(self):
print("init A 开始被调用")
print( "init A Class")
print("init A 结束被调用")

class B(A):
def __init__(self):
print("init B 开始被调用")
print("init B class")
super(B, self).__init__()
print("init B 结束被调用")


class C(A):
def __init__(self):
print("init C 开始被调用")
print("init C class")
super(C, self).__init__()
print("init C 结束被调用")


class D(B,C):
def __init__(self):
print("init D 开始被调用")
print ("init D class")
super(D, self).__init__()
print("init D 结束被调用")


class E(A):
def __init__(self):
print("init E 开始被调用")
print ("init E class")
super(E, self).__init__()
print("init E 结束被调用")


class F(E,D):
def __init__(self):
print("init F 开始被调用")
print ("init F class")
super(F, self).__init__()
print("init F 结束被调用")


# a = A()
# b = B()
# c = C()
# d = D()
# e = E()
f = F()

结果:
--------------------------------------------------------------------------------
init F 开始被调用
init F class
init E 开始被调用
init E class
init D 开始被调用
init D class
init B 开始被调用
init B class
init C 开始被调用
init C class
init A 开始被调用
init A Class
init A 结束被调用
init C 结束被调用
init B 结束被调用
init D 结束被调用
init E 结束被调用
init F 结束被调用
(<class ‘__main__.F‘>, <class ‘__main__.E‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>)
--------------------------------------------------------------------------------

若改为
class A(object):
def __init__(self):
print("init A 开始被调用")
print( "init A Class")
print("init A 结束被调用")

class B(A):
def __init__(self):
print("init B 开始被调用")
print("init B class")
super(B, self).__init__()
print("init B 结束被调用")


class C(A):
def __init__(self):
print("init C 开始被调用")
print("init C class")
super(C, self).__init__()
print("init C 结束被调用")


class D(B,C):
def __init__(self):
print("init D 开始被调用")
print ("init D class")
super(D, self).__init__()
print("init D 结束被调用")


class E(A):
def __init__(self):
print("init E 开始被调用")
print ("init E class")
super(E, self).__init__()
print("init E 结束被调用")


class F(D,E):
def __init__(self):
print("init F 开始被调用")
print ("init F class")
super(F, self).__init__()
print("init F 结束被调用")


# a = A()
# b = B()
# c = C()
# d = D()
# e = E()
f = F()

则结果:
--------------------------------------------------------------------------------
init F 开始被调用
init F class
init D 开始被调用
init D class
init B 开始被调用
init B class
init C 开始被调用
init C class
init E 开始被调用
init E class
init A 开始被调用
init A Class
init A 结束被调用
init E 结束被调用
init C 结束被调用
init B 结束被调用
init D 结束被调用
init F 结束被调用
(<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.C‘>, <class ‘__main__.E‘>, <class ‘__main__.A‘>, <class ‘object‘>)
--------------------------------------------------------------------------------

 

[python]面向对象三大基本特性---继承

原文:https://www.cnblogs.com/vanjoe/p/12768062.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!