8.05_python_lx_day23

一.继承 -> 单继承

如果一个类继承另外一个类,该类叫做子类(衍生类),被继承的类叫做父类(基类,超类)

继承: (1) 单继承 (2) 多继承
python中,所有的类都默认继承父类object

 

class Human(object):
    hair = "黑色"
    sex = ""
    
    def cry(self):
        print("人类在伤心的时候,会留下鳄鱼的眼泪")
        
    def eat(self):
        print("人类在远古时候,抓到猎物直接吃")

    def __makebaby(self):
        print("人类在发育到成熟的时候,会造人")

 

(1) 子父继承之后,子类可以调用父类的公有成员

1 class Man(Human):#Man是Human的子类
2     pass
3 obj = Man()
4 print(obj.hair)
5 obj.cry()

(2) 子父继承之后,子类不能调用父类的私有成员

1 class Woman(Human):#Woman是Human的子类
2     def pub_func(self):
3         self.__makebaby()
4 obj = Woman()
5 # obj.__makebaby() error
6 # obj.pub_func() error 

(3) 子父继承之后,子类可以改写父类中的方法

  • 子父继承之后
  • 如果子类里面有该成员属性或者方法,优先调用自己的
  • 如果没有该成员,调用父类中的成员
  • 如果都没有,直接报错
1 class Children(Human):
2     sex = "女性"
3     def cry(self):
4         print("小孩只会哇哇哇的哭")
5 obj = Children()
6 obj.cry()
7 print(obj.__dict__)
8 print(Children.__dict__)

二.多继承

(1) 基本语法

class Father():
    property = "风流倜傥,一表人才,一枝梨花压海棠"
    def f_hobby(self):
        print("社会摇,蹦迪,吃喝嫖赌,大保健")

class Mother():
    property = "闭月羞花,倾国倾城,一枝红杏出墙来"
    def m_hobby(self):
        print("打麻将,打牌,喝酒抽烟烫头,跳广场舞")

class Daughter(Father,Mother):
    pass

实例化对象

1 obj = Daughter()
2 print(obj.property)
3 obj.m_hobby()

(2) super用法

  1. super本身是一个类 super()是一个对象 用于调用父类的绑定方法
  2. super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
  3. super用途: 解决复杂的多继承调用顺序
class Father():
    property = "风流倜傥,一表人才,一枝梨花压海棠"
    def f_hobby():
        print("社会摇,蹦迪,吃喝嫖赌,大保健")

class Mother():
    property = "闭月羞花,倾国倾城,一枝红杏出墙来"
    def m_hobby(self):
        print("打麻将,打牌,喝酒抽烟烫头,跳广场舞")

class Son(Father,Mother):
    property = "喜欢打游戏,wow,lol,dnf,泡泡堂,cf,dota,大话西游,跑跑卡丁车,吃鸡"    

<1>利用类来调用父类的成员

1     def skill1(self):    
2         Father.f_hobby()
3         print(Mother.property)

<2>利用对象调用父类的成员

1     def skill2(self):
2         self.m_hobby()
3         print(self.property)

<3>利用super调用父类的属性和方法

1     def skill3(self):
2         # print(super())
3         print(super().property)
4         super().m_hobby()
5         # super().f_hobby() error
  • super()只调用父类的相关公有成员,不会调用自己的本类成员,父类没有直接报错.
  • super()在调用父类方法时,只调用父类的绑定方法,默认传递参数是本类的对象self

(3)self 和 super()的区别

  1. self    在调用成员时,先看看自己的类对象中是否存在该成员,如果有调用自己的,如果没有,调用父类的.如果都没有报错
  2. super() 在调用成员时,只调用父类的相关成员(属性,绑定方法),永远不会调用自己的.如果父类没有,直接报错

 

三.菱形继承 (钻石继承)

     Human
Man          Woman
    Children
class OldWoman():
    pass

class Human():
    pty = 4
    def feelT(self):
        print("原始人类如果热了,脱皮1")
        print(self.pty)
        print("原始人类如果冷了,扒别人的皮2")
    
class Man(Human):
    pty = 3
    def feelT(self):
        print("现代男人如果热了,脱衣服,脱裤子3")
        super().feelT()
        print("现代男人如果冷了,脱别人的衣服,脱别人的裤子4")
        
class Woman(Human):
    pty = 2
    def feelT(self):
        print("现代女人如果热了,吹空调,吃雪糕5")
        super().feelT()
        print("现代女人如果冷了,喝热水,用暖宝宝6")
    
class Children(Man,Woman):
    pty = 1
    def feelT(self):
        print("现代小孩如果热了,就哭,嗯哭7")
        super().feelT()
        print("现代小孩如果冷了,也要哭8")
        
obj = Children()
obj.feelT()

(1)mro 列表 : super用途的一个体现.解决复杂的多继承调用顺序关系

  • 类.mro()  返回的是方法调用顺序列表,针对于多继承下的同名方法,按照顺序依次的进行调用
lst = Children.mro()
print(lst)
  • [
  • <class '__main__.Children'>, 
  • <class '__main__.Man'>, 
  • <class '__main__.Woman'>, 
  • <class '__main__.Human'>, 
  • <class 'object'>
  • ]

(2)issubclass 判断子父关系 (应用在类当中,判断子父关系)

  • 只要在一条继承链上即可(有血缘关系)
 1 res = issubclass(Children,Man)
 2 print(res)
 3 res = issubclass(Children,Woman)
 4 print(res)
 5 res = issubclass(Children,Human)
 6 print(res)
 7 res = issubclass(Children,(Human,Woman,Man,OldWoman))
 8 print(res)
 9 res = issubclass(Children,OldWoman)
10 print(res)

(3)isinstance (应用在对象和类之间,判断类型)

  • 只要在一条继承链上即可(有血缘关系)
1 res = isinstance(obj,Children)
2 print(res)
3 res = isinstance(obj,Human)
4 print(res)
5 res = isinstance(obj,(Human,Children,Woman))
6 print(res)
7 res = isinstance(obj,OldWoman)
8 print(res)

四.魔术方法 (特定时机,自动触发)

(1)__init__魔术方法(构造方法)

  • 触发时机:实例化对象,初始化的时候触发
  • 功能:为对象添加成员
  • 参数:参数不固定,至少一个self参数

 

  • 返回值:无

<1>基本语法

1 class MyClass():
2     def __init__(self):
3         print("初始化方法被触发")
4         # 为当前对象self 添加成员 name
5         self.name = "abc"
6 # 实例化对象 
7 obj = MyClass()
8 print(obj.name)

<2>带有多个参数的构造方法

1 class MyClass():
2     def __init__(self,name):    
3         # self.成员名 = 参数
4         self.name = name
5 # 实例化对象
6 obj = MyClass("123") # 在实例化对象时候,给构造方法传递参数
7 print(obj.name)

<3>类可以是一个,对象可以是多个

  • 一个类可以实例化多个不同的对象,而对象和对象之间彼此独立,但都可以使用类中的公有的成员
class Children():
    def __init__(self,name,skin):
        self.name = name
        self.skin = skin
        
    def cry(self):
        print("小孩一出生就哇哇哇的哭")
        
    def drink(self):
        print("小孩一出生就要喝奶奶")
    
    def __la(self):
        print("小孩拉粑粑是私有的")
        
    def pub_info(self):
        print("该对象的名字是{},该对象的肤色是{}".format(self.name,self.skin))

①创建第一个小孩

1 afanda = Children("阿凡达","蓝色的")
2 afanda.pub_info()
3 afanda.cry()

②创建第二个小孩

1 afanti = Children("阿凡提","黄色的")
2 afanti.pub_info()
3 afanti.drink()

③创建第三个小孩

1 bao = Children("我滴宝强","绿色的")
2 bao.pub_info()
3 bao.__la() # 无法在类外调用私有的成员

 

(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)(3)super用途: 解决复杂的多继承调用顺序

posted @ 2020-08-05 01:11  Magicianlx  阅读(167)  评论(0编辑  收藏  举报