欢迎来到战五渣的博客

人生三重境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

028.Python面向对象继承(单继承,多继承,super,菱形继承)

一 继承的概念

种类

  • 单继承
  • 多继承

至少两个类:

  • 子类:一个类继承另外一个类,那么该类是子类(也叫作衍生类)
  • 父类:另外一个,这个被继承的类,叫做父类(也叫作超类),object 在python中 这个类是所有类的父类

二  单继承

2.1 子父继承之后,子类可以使用父类的公有成员属性方法

class Plane():
        capitain = "一般是男性"
        price = "一般保密"
        def fly(self):
                print("飞机都会飞")
        def capitain(self):
                print("一般都会有一个副驾驶员")
        def __price(self):
                print ("保密")
# 想让一个类继承另外一个类,语法在定义类的时候,括号里面写(父类)
class Fighter(Plane):
        pass

obj = Fighter()
print (obj.price)

class Airliner(Plane):
        def Airliner_price():
                self.__price

执行

[root@node10 python]# python3 test.py
一般保密

2.2 子父继承之后,子类不能调用父类的私有成员属性方法

class Plane():
        capitain = "一般是男性"
        price = "一般保密"
        def fly(self):
                print("飞机都会飞")
        def capitain(self):
                print("一般都会有一个副驾驶员")
        def __price(self):
                print ("保密")

class Fighter(Plane):
        pass

obj = Fighter()
print (obj.price)

class Airliner(Plane):
        def Airliner_price():
                self.__price

obj = Airliner()
obj.Airliner_price()

执行

调用私有方法

class Plane():
        capitain = "一般是男性"
        price = "一般保密"
        def fly(self):
                print("飞机都会飞")
        def capitain(self):
                print("一般都会有一个副驾驶员")
        def __price(self):
                print ("保密")

class Fighter(Plane):
        pass

obj = Fighter()
print (obj.price)

class Airliner(Plane):
        def Airliner_price():
                self.__price

obj = Airliner()
obj.__price

执行

[root@node10 python]# python3 test.py
一般保密
Traceback (most recent call last):
  File "test.py", line 22, in <module>
    obj.__price
AttributeError: 'Airliner' object has no attribute '__price'

 2.3 子父继承之后,子类可以改写父类的公有方法

  • 如果子类当中含有该方法,那么优先调用子类的方法
  • 如果子类当中不含有该方法,再去调用父类的方法.

有就调用自己的,没有就调用父类的(一定是共有的成员属性方法;)

class Plane():
        capitain = "一般是男性"
        price = "一般保密"
        def fly(self):
                print("飞机都会飞")
        def capitain(self):
                print("一般都会有一个副驾驶员")
        def __price(self):
                print ("保密")

class Fighter(Plane):
        def capitain(self):
                print ("机长是John")
obj = Fighter()
obj.capitain()

执行

[root@node10 python]# python3 test.py
机长是John

三  多继承

3.1 基本结构

class Picture():
        p_style = "classic"
        def colour(self):
                print ("bule,green,gray,yellow")

class Music():
        m_style = "confitable"
        def Tone(self):
                print ("宫商角微羽")
#继承两个父类
class Surroundings(Picture,Music):
        pass
obj = Surroundings()
print (obj.p_style)
obj.Tone()

执行

[root@node10 python]# python3 test.py
classic
宫商角微羽

3.2 super 调用父类的相关公有属性方法

  1. super本身是一个类 super()是一个对象 用于调用父类的绑定方法
  2. super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
  3. super用途: 解决复杂的多继承调用顺序
class Picture():
        p_style = "classic"
        def colour(self):
                print ("bule,green,gray,yellow")

class Music():
        m_style = "confitable"
        def Tone(self):
                print ("宫商角微羽")

class Surroundings(Picture,Music):
        p_style = "Modern"
        def s_tone(self):
                print(self.p_style)
                self.Tone()
        print (Picture.p_style)
        Music.Tone("123")
        def s_tone2(self):

                res = super().p_style
                print (res)
                super().Tone()

obj = Surroundings()
obj.s_tone()

执行

[root@node10 python]# python3 test.py
classic
宫商角微羽
Modern
宫商角微羽

使用super

class Picture():
        p_style = "classic"
        def colour(self):
                print ("bule,green,gray,yellow")

class Music():
        m_style = "confitable"
        def Tone(self):
                print ("宫商角微羽")

class Surroundings(Picture,Music):
        p_style = "Modern"
        def s_tone(self):
                print(self.p_style)
                self.Tone()
        print (Picture.p_style)
        Music.Tone("123")
        def s_tone2(self):

                res = super().p_style
                print (res)
                super().Tone()

obj = Surroundings()
obj.s_tone2()

执行

[root@node10 python]# python3 test.py
classic
宫商角微羽
classic
宫商角微羽

四 菱形继承

4.1 基本实例

class Human():
        pty = 111
        def feelT(self):
                print("1111")
                print(self.pty)
                print("2222")


class Man(Human):
        pty = 222
        def feelT(self):
                print("3333")
                super().feelT()
                print("4444")
class Woman(Human):
        pty = 333
        def feelT(self):
                print("5555")
                super().feelT()
                print("6666")
class Children(Man,Woman):
        pty = 444
        def feelT(self):
                print("7777")
                super().feelT()
                print("8888")

obj = Children()
obj.feelT()
'''
# mro列表  类.mro() 使用c3算法,针对于多继承的情况,按照这个列表依次调用.调用顺序都在其中
# 如果出现重名方法,  super() 就是按照这个列表依次调用
'''
res = Children.mro()
print(res)

执行

7777
3333
5555
1111
444
2222
6666
4444
8888
[
<class '__main__.Children'>,
<class '__main__.Man'>,
<class '__main__.Woman'>,
<class '__main__.Human'>,
<class 'object'>
]

执行过程

  1. 调用obj.feelT(),这个是children的这个类,打印出7777
  2. 执行children类中方法的super().feelT(),但是每一个类都有FeelT的方法,使用Mro表(Children,man,woman,human),依次执行3333,5555,1111,但是停留在human的这个类上
  3. 执行print(self.pty),最初的是在children,打印出444
  4. 执行print("2222"),打印2222,这个类执行完,回到上一层的类woman
  5. 执行print("6666"),打印6666,则woman这个泪执行玩,回到上一层man
  6. 执行print("4444"),打印4444,则man的这个类执行完,回到上一层children
  7. 执行print("8888"),打印8888,整个过程执行,最后打印mro表

4.2 判断子父关系

class Human():
        pty = 111
        def feelT(self):
                print("1111")
                print(self.pty)
                print("2222")


class Man(Human):
        pty = 222
        def feelT(self):
                print("3333")
                super().feelT()
                print("4444")

class Woman(Human):
        pty = 333
        def feelT(self):
                print("5555")
                super().feelT()
                print("6666")

class Children(Man,Woman):
        pty = 444
        def feelT(self):
                print("7777")
                super().feelT()
                print("8888")

obj = Children()
obj.feelT()
'''
# mro列表  类.mro() 使用c3算法,针对于多继承的情况,按照这个列表依次调用.调用顺序都在其中
# 如果出现重名方法,  super() 就是按照这个列表依次调用
'''
res = Children.mro()
print(res)

res= issubclass(Children,Man)
# 判断Children 是不是元组当中一个类的子类,有一个成立,返回真,一个都不满足,返回假
res = issubclass(Children,(Man,Woman))
print(res)
# 只要有血缘关系即可.
res = issubclass(Children,Human)
print(res)


# 判断obj这个对象类型是不是Children (有继承的血缘关系即可)
'''
python当中,万物皆是对象,只是对象常常这两字被省略.
'''
res = isinstance(obj,Children)
print(res)
res = isinstance(obj,Human)
print(res)
res = isinstance(obj,(Man,Woman))
print(res)

执行

7777
3333
5555
1111
444
2222
6666
4444
8888
[<class '__main__.Children'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Human'>, <class 'object'>]
True
True
True
True
True
posted @ 2020-02-16 15:11  梦中泪  阅读(351)  评论(0编辑  收藏  举报