python 面对对象 类 继承

继承

继承就是为了解决两个有大量重复性代码的类,抽象出一个更抽象的类放公共代码,主要是代码复用,方便代码的管理与修改

类的继承包括属性和方法,私有属性也可继承

class Person():               # 默认是继承object超类
    pass

class Man(Person):
    pass

print(Person.__bases__)       # __bases__查询父类
print(Man.__bases__)          # 继承Person
class Person():

    eat = '吃饭'

    def __init__(self):
        self.people = '人'

    def shuijiao(self):
        print('睡觉')

class Man(Person):
    pass

print(dir(Person))
print(dir(Man))         # 属性方法全部继承

a = Man()
print(dir(a))
class Person():

    def __init__(self, name):
        self.name= name

class Man(Person):
    pass

s = Man('张三')         # 父类初始化要传值,子类也需要
print(s.name)            # 张三

解决私有属性的调用

class Person():

    def __init__(self, age):
        self.__age = age

    def run(self):
        print(self.__age)    # 这里可以调用私有属性

class Man(Person):
    pass
    # def to(self):
    #     print(self.__age)        # 无法在子类调用私有属性


s = Man(18)
# s.to()              # 无法直接调用父类的私有属性
print(dir(s))       # 但是私有属性也会被继承

s.run()            # 通过写一个方法来调用私有属性

 

 

继承顺序

按照继承顺序来,首先是实例本身,然后是实例的类,然后是父类,以此类推,最后是object超类

class Person():

    def __init__(self, age):
        self.age = age

class Man(Person):
    pass

s = Man(18)

print(s.__class__.__mro__)     # (<class '__main__.Man'>, <class '__main__.Person'>, <class 'object'>)
print(Man.__mro__)             # 跟以上一样

 

多继承

class Person():
    texp = '直立行走'
    def __init__(self, age):
        self.name = '人'
        self.age = age
        self.__sex = '性别'

    def run(self):
        print('人会跑')

class Man(Person):
    a = '父'

class Woman(Person):
    a = '母'

class Son(Woman, Man):        # 谁在前,就先继承谁,依据这里
    pass

 print(Son.__mro__)

# (<class '__main__.Son'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Person'>, <class 'object'>)

继承的属性或方法与父类同名会怎么样

先继承谁的,就依据谁的,按照上面的这个代码的话,那就是继承Woman的,如果是需要调用到 “a” 那么就是输出 “母”

 

 

 

重构(重写)

class Person():

    def __init__(self, age):
        self.age = age

class Man(Person):
    a = '父'

class Woman(Person):
    a = '母'

class Son(Woman, Man):
    def __init__(self, name):          # 父类子类同时初始化,也是按照继承顺序来
        self.name = name

s = Son('张三')
print(s.name)                          # 初始化按照继承顺序来

 

 

定向继承

super,指定继承,需要有继承关联

super(): 是用于调用父类的一个方法,遵循就近原则

是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(mro)、重复调用

class Person():

    def __init__(self, age):
        self.age = age

    def eat(self):
        print('吃饭')

class Man(Person):
    a = '父'

class Woman(Person):
    a = '母'

class Son(Woman, Man):
    def run(self):
        super().eat()
        print(super().a)
        print(super(Woman, self).a)

s = Son(18)
s.run()

# 吃饭
# 母
# 父

 

 

  • 48
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值