面向对象

2、面向对象之继承

继承:一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法

一个类继承另一个类,那么该类就是子类(衍生类),被继承的这个叫做父类(基类,超类)

继承的3种形式:单继承、多继承、菱形继承

注:python中所有类都默认继承object类(python3.X版本,python2.X则不会默认继承object类)

单继承

一个子类只继承一个父类

继承的特点(子类继承父类)

​ (1)子类可以调用父类所有的公有成员

​ (2)子类不可以调用父类的私有成员

​ (3)子类可以重写父类的同名方法

调用优先级(子类继承父类)

​ 如果子类里面有该成员属性方法,优先调用自己的

​ 如果没有该成员,name调用父类的公有成员

​ 如果都没有,直接报错

class Human(object):
    hair = "金色"
    sex = "男"

    def eat(self):
        print("人类的天性吃吃吃")

    def la(self):
        print('人类天生就需要lalala')

    def __makebaby(self):
        print("人类天生就能繁衍后代")

# 继承
class Man(Human):
    pass

obj = Man()
print(obj.hair)

class WoMan(Human):
    def pub_makbaby(self):
        self.__makebaby()

obj = WoMan()
obj.eat()

# 方法重写
class Children(Human):
    sex = "女性"
    def eat(self):
        print("小孩出生只能喝奶")

obj = Children()
print(obj.sex)
obj.eat()
多继承

一个子类继承多个父类

super用法

(1)super本身是一个类,super()是一个对象,用于调用父类的绑定方法

(2)super()只应用在绑定方法中,默认自动传递self对象(前提:super所在作用域存在self)

(3)super作用:解决复杂的多继承调用顺序

super调用父类的相关公有成员,不会调用自己类中的成员,父类若没有,报错

注:super和self不同,super只调用父类

# 多继承
class Father:
    property = "玉树临风,风流倜傥,一枝梨花压海棠"
    def f_hobby(self):
        print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")

class Mother:
    property = "闭月羞花,沉鱼落雁,一只红杏出墙来"
    def m_hobby(self):
        print("打麻将,敷面膜,跳广场舞")

class Daughter(Mother, Father):
    pass

obj = Daughter()
print(obj.property)
obj.m_hobby()
class Father:
    property = "玉树临风,风流倜傥,一枝梨花压海棠"
    def f_hobby():
        print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")

class Mother:
    property = "闭月羞花,沉鱼落雁,一只红杏出墙来"
    def m_hobby(self):
        print("打麻将,敷面膜,跳广场舞")

class Son(Father, Mother):
    property = "打游戏,比如lol,wow,dota2"

    # 使用类调用父类成员
    def skill1(self):
        print(Mother.property)
        Father.f_hobby()

    # 使用对象调用父类成员
    def skill2(self):
        self.m_hobby()
        print(self.property)

    def skill3(self):
        print(super())
        print(super().property)
        super().m_hobby()

obj = Son()
obj.skill1()
obj.skill2()
print('<===>')
obj.skill3()
菱形继承

菱形继承:两个子类继承同一个父类,而又有子类同时继承两个父类

mro列表:super用途的体现,解决复杂的多继承调用顺序

类.mro返回的是方法调用顺序的列表,针对于多继承下的同名方法,按照列表的顺序依次调用

issubclass:判断是否存在子父关系(使用方法和isinstance的使用一模一样),在同一继承链中即可

isinstance:判断类型,在同一继承链中即可

class BigMan():
    pass

class Human():
    pty = 4
    def feelT(self):
        print("原始人类天热了,让后裔把太阳射下来1")
        print(self.pty)
        print("原始人类天冷了,让女娲补天,防止漏风2")

class Man(Human):
    pyt = 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()

# mro
lst = Children.mro()
print(lst)

# issubclass
ret1 = issubclass(Children, Man)
ret2 = issubclass(Children, Woman)
ret3 = issubclass(Children, Human)
ret4 = issubclass(Children, BigMan)
ret = issubclass(Children, (Man, Woman, Human, BigMan))
print(ret1, ret2, ret3, ret4, ret)

# isinstance
ret1 = isinstance(obj, Children)
ret2 = isinstance(obj, Man)
ret3 = isinstance(obj, Human)
ret4 = isinstance(obj, Woman)
ret = isinstance(obj, BigMan)
print(ret1, ret2, ret3, ret4, ret)

print(Children.__dict__)

ret = "feelT" in Children.__dict__
print(ret)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值