03_面向对象之继承

# 1:什么是继承?跟我来,看下面的代码
class Father: # (父类 --> 专业术语:基类)
def f1(self):
print('我是f1')


class Sun(Father): # -->(子类 -->专业术语:派生类)
def f2(self):
print('我是f2')
# 在第二个类中,传入另外一个类,就是继承!

# ---------------------------------------------- #

# 2:继承有什么用?跟我来,看下面的代码
class Father: # (父类 --> 专业术语:基类)
def f1(self):
print('我是f1')


class Sun(Father): # -->(子类 -->专业术语:派生类)
def f2(self):
print('我是f2')

obj = Sun()
obj.f2() # 打印的是谁? --> 我是f2
obj.f1() # 打印的是谁? --> 我是f1
# 由上面可以得出,当我们继承了父类(基类),对象调用的方法如果在子类
# 中没有的话,就会去父类里面找
# (但是,父类是不能来子类里面找的)如下:
obj1 = Father()
obj1.f2() # 运行报错。

# ---------------------------------------------- #

# 3: 类的多继承和类的多继承查找顺序
class Father1: # (父类 --> 专业术语:基类)
def f1(self):
print('我是父类的f1')


class Father2: # (父类 --> 专业术语:基类)
def f1(self):
print('我是父类2的f1')

def f3(self):
print('我是父类2的f3')


class Sun(Father1, Father2): # -->(子类 -->专业术语:派生类)
def f2(self):
print('我是f2')


obj = Sun()
obj.f1() # 打印的是谁? --> 我是父类1的f1
obj.f3() # 打印的是谁? --> 我是父类1的f3
# 由上面的打印结果可以得出:调用方法时,
# 类的多继承查找顺序是:先去子类找,如果没有的话,
# 就去父1中找, 没有再去父2中找
# 补充:目前只有python和C++支持多继承,其他基本没有

# ---------------------------------------------- #

# 4:继承的执行顺寻:
# 记住两个原则:
# 1)self 到底是谁?
# 2)self 是由谁创建的,就去该创建者中去找
class F1:
def f1(self):
self.f2()
pass

def f2(self):
print('我是F1中的f2')


class F2(F1):
def f2(self):
print('我是F2中的f2')


obj = F2()
obj.f1() # 打印谁? --> 我是F2中的f2
# 执行顺寻:根据上面说的两个原则
# 1)obj对象是F2创建的,所以先去F2中找,没有
# 2)obj在去F1中查找,找f1,但是f1中调用了f2
# 问题:现在要确定f2是调用的F1类还是F2类中的f2功能?
# 3)根据原则1:因为对象是obj,所以F1中的 self就是obj
# ,又因为obj是由F2创建的,所以先去F2中找f2()有则打印
# 4)上面F2中有F2所以就打印出来了

注释:下面这个执行的顺序非常重要,需要弄清楚,不是看源码基本GG
继承的执行顺序:
记住两个原则:
1)self 到底是谁?
2)self 是由谁创建的,就去该创建者中去找


猜你喜欢

转载自www.cnblogs.com/haibaiwuchang/p/13401636.html