Python学习 - 面向对象之继承

本文详细介绍了Python中的面向对象编程概念,包括继承、方法重写以及super()函数的使用。通过实例展示了如何创建类、子类,以及如何调用父类的方法。此外,还讲解了多重继承和bases属性,帮助读者深入理解Python的类层次结构和代码复用原则。
摘要由CSDN通过智能技术生成

Python学习 - 语法入门:https://blog.csdn.net/wanzijy/article/details/125287855
Python学习 - 数据类型:https://blog.csdn.net/wanzijy/article/details/125341568
Python学习 - 流程控制:https://blog.csdn.net/wanzijy/article/details/125400906
Python学习 - 运算符(操作符):https://blog.csdn.net/wanzijy/article/details/125387919
Python学习 - 列表:https://blog.csdn.net/wanzijy/article/details/125457990
Python学习 - 字典:https://blog.csdn.net/wanzijy/article/details/125567225
Python学习 -元组和集合:https://blog.csdn.net/wanzijy/article/details/125577609
Python学习 - 函数(1):https://blog.csdn.net/wanzijy/article/details/125669084
Python学习 - 函数(2):https://blog.csdn.net/wanzijy/article/details/125739981
Python学习 - 类与对象:https://blog.csdn.net/wanzijy/article/details/125826952
Python学习 - 面向对象之封装:https://blog.csdn.net/wanzijy/article/details/125902925
Python学习 - 面向对象之继承:https://blog.csdn.net/wanzijy/article/details/125963829
Python学习 - 面向对象之多态:https://blog.csdn.net/wanzijy/article/details/127140632
Python - 文件操作(1):https://blog.csdn.net/wanzijy/article/details/127099071
Python - 文件操作(2):https://blog.csdn.net/wanzijy/article/details/127150189
Python学习 - 垃圾回收、特殊方法和模块:https://blog.csdn.net/wanzijy/article/details/126202999
Python学习 - 异常处理:https://blog.csdn.net/wanzijy/article/details/126803672

1. 简介

通过继承可以使一个类获取到其他类中的属性和方法
在定义类时,可以在类名后的括号中指定当前类的父类(超类、基类、super)

子类(衍生类)可以直接继承父类中的所有属性和方法
通过继承可以直接让子类获取到父类的方法或属性,避免编写重复性的代码,并且也符合OCP原则,所以经常使用继承来对一个类进行扩展

如果在创建类时,省略了父类,则默认父类是Object
所有的类都继承自Object

issubclass(C, B) 检查C是不是B的子类;是的话返回True,反之

class Animal():
    def run(self):
        print('动物会跑~~~')
    def sleep(self):
        print('动物睡觉~~~')

class Dog(Animal):
    def bark(self):
        print('汪汪汪~~~')

class Hashiqi(Dog):
    def hashiqiBark(self):
        print('哈士奇汪汪汪~~~')

d = Dog()
d.run()

print(isinstance(d, Animal))  #  True
print(isinstance(d, Dog))  #  True

ha = Hashiqi()
ha.hashiqiBark()
ha.run()

print(issubclass(Animal, object))  #  True

2. 方法重写

如果在子类中有和父类同名的方法,则通过子类实例去调用方法时会调用子类的方法而不是父类的方法,这个特点就叫做方法的重写
当我们调用一个对象的方法时,会优先去当前对象中寻找是否具有该方法,如果有则直接调用。如果没有,则取当前对象的父类中寻找。如果还是没有就继续往上找,直到找到 Object,还是没有找到的话就会报错

class A():
    def test(self):
        print('我是A')

class B(A):
    pass

class C(B):
    pass

c = C()
c.test()  #  我是A

3. super()

父类中所有方法都会被子类继承,包括特殊方法

如果想直接调用父类的 “ _init_ ” 来初始化父类中定义的属性,可以使用下面的方法

class Animal():
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name
    @name.setter
    def name(self, name):
        self._name = name

class Dog(Animal):
    def __init__(self, name, age):
		#  这里是使用对象来直接调用方法,所以要传self参数;如果是使用对象的实例来调用方法,则不用传self参数
        Animal.__init__(self, name)  
        self._age = age

    @property
    def age(self):
        return self._age
    @age.setter
    def age(self, age):
        self._age = age

d = Dog('旺财', 18)
print(d.name)
print(d.age)

但是像上面的方法,导致父类直接写死在代码中,提高了代码的耦合度

super() 用来获取当前类的父类,此时上述的代码可以改写成

class Animal():
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name
    @name.setter
    def name(self, name):
        self._name = name

class Dog(Animal):
    def __init__(self, name, age):
        super().__init__(name)  #  通过super()返回对象对象调用父类方法时,不需要传递self参数
        self._age = age

    @property
    def age(self):
        return self._age
    @age.setter
    def age(self, age):
        self._age = age

d = Dog('旺财', 18)
print(d.name)
print(d.age)

4. 多重继承

_bases_ 属性

  • 可以用来获取当前类的所有父类
  • 返回的是一个元组
class A():
    def test(self):
        print('我是A')

class B(A):
    pass

class C(B):
    pass

print(C.__bases__)  #  (<class '__main__.B'>,)

在 Python 中是支持多重继承的,也就是我们可以为一个类同时指定多个父类
可以在类名的 () 后边可以添加多个类,来实现多重继承
多重继承会使子类同时拥有多个父类,并且会获取到所有父类中的方法

不过应该要避免使用多重继承,因为多重继承会让代码过于复杂
如果多个父类中有同名的方法,则会先在第一个父类中寻找,然后找第二个,以此类推。其实就是前面父类的方法覆盖后面父类的方法

class D():
    def test(self):
        print('D的test()')

class E():
    def test(self):
        print('E的test()')

class F(D, E):
    pass

print(F.__bases__)  #  (<class '__main__.D'>, <class '__main__.E'>)
f = F()
f.test()  #  D的test()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LF3_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值