找回密码
 会员注册
查看: 30|回复: 0

python面向对象之继承

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-10 05:11:16 | 显示全部楼层 |阅读模式
文章目录前言继承的概念单继承多继承子类重写父类的同名方法和属性子类调用父类同名的方法和属性多层继承私有权限前言前面我们已经学习了python面向对象的类和对象,那么今天我将为大家分享面向对象的三大特性之一:继承。继承具有以下特性:代码重用:继承允许我们创建一个新的类,并从一个或多个现有的类中继承属性和方法。这使得我们可以避免重复编写相同的代码,提高代码的重用性。通过继承,我们可以在基类的基础上构建更特定和具体的子类。扩展功能:通过继承,我们可以在基类的基础上添加新的属性和方法,以实现对基类功能的扩展。这样,我们可以在不修改基类代码的情况下,通过子类来定制或扩展特定的行为。这种灵活性使得我们能够轻松地适应不断变化的需求。组织和抽象概念:通过继承,我们可以组织类之间的关系,并以更抽象的方式来表达概念和逻辑。通过将共同的属性和方法放在基类中,我们可以更清晰地表达类之间的关系和层次结构。这种抽象化的设计能够提高代码的可读性和可维护性。实现多态性:继承也为实现多态性(Polymorphism)提供了基础。多态性是面向对象编程中非常重要的概念,它可以让我们使用统一的方式处理不同的对象类型。通过继承,我们可以创建不同的子类,它们共享相同的基类接口,但可能有不同的实现方式。这样,我们可以根据具体的对象类型来调用适当的方法,实现更灵活和可扩展的程序设计。学习好了继承,可以为后面的抽象和多态打好基础,那么就由我带领大家走进python继承的世界吧。🚗🚗🚗继承的概念在生活中,继承通常是指子女继承父母的财产。但是在python中稍有区别,两个具有一定关系的子类和父类,子类会继承父类的所有除了私有的属性和方法。我们可以访问以及修改继承来的属性和方法。在python中使用class子类名(父类名):来表示继承关系。classAnimal():def__init__(self):self.info='动物'deffunc(self):print(f'属于{self.info}')classCat(Animal):pass#这里pass是占位符,防止报错cat=Cat()cat.func()#属于动物123456789101112'运行运行继承可以很大程度的提高代码的复用率,提高代码的简洁性。在python中,其实每一个类都默认继承一个object基类单继承一个类可以只继承一个类,这种继承关系叫做单继承。classMaster():def__init__(self):self.wugong='太极'deffunc(self):print(f'身怀绝技:{self.wugong}')classPrentice(Master):passzhangsan=Prentice()zhangsan.func()#身怀绝技:太极123456789101112'运行运行多继承一个类也可以继承多个父类,这种继承关系叫做多继承。classMaster2():def__init__(self):self.wugong='闪电五连鞭'deffunc(self):print(f'身怀绝技:{self.wugong}')classPrentice(Master1,Master2):passzhangsan=Prentice()zhangsan.func()123456789101112当我们一个继承多个父类的时候,如果没有特地指明,默认使用第一个继承的父类的属性和方法。如果我们想要查看该类的继承关系,我们可以使用__mro__来查看继承关系。print(Prentice.__mro__)1子类重写父类的同名方法和属性子类继承父类的属性和方法,不可能原封不动的继承,子类也可以具有自己的特性。那么这里就需要用到重写的方法了。classMaster1():def__init__(self):self.wugong='太极'deffunc(self):print(f'身怀绝技:{self.wugong}')classMaster2():def__init__(self):self.wugong='闪电五连鞭'deffunc(self):print(f'身怀绝技:{self.wugong}')classPrentice(Master1,Master2):def__init__(self):self.wugong='太极+轻功'deffunc(self):print(f'身怀绝技:{self.wugong}')zhangsan=Prentice()zhangsan.func()#身怀绝技:太极+轻功1234567891011121314151617181920212223'运行运行子类调用父类同名的方法和属性当我们在子类中调用和父类具有相同名字的属性和方法的时候,默认会调用子类具有的属性和方法。classMaster1():def__init__(self):self.wugong='太极'deffunc(self):print(f'身怀绝技:{self.wugong}')classMaster2():def__init__(self):self.wugong='闪电五连鞭'deffunc(self):print(f'身怀绝技:{self.wugong}')classPrentice(Master1,Master2):def__init__(self):self.wugong='火星大力拳'deffunc(self):print(f'身怀绝技:{self.wugong}')zhangsan=Prentice()zhangsan.func()#身怀绝技:火星大力拳1234567891011121314151617181920212223'运行运行那么如果我们要在父类中调用具有同名的父类的属性和方法该怎么做呢?如果是先调用了父类的属性和方法,父类的属性和方法会覆盖子类的属性和方法,所以如果我们想要使用子类自己的属性和方法,需要调用子类自己的初始化方法。如果我们想要在子类中调用父类的属性和方法,我们也需要先调用父类的初始化方法。先调用父类的初始化方法,然后再使用父类类名.方法(self)来调用父类的方法。classMaster():def__init__(self):self.wugong='太极'deffunc(self):print(f'身怀绝技:{self.wugong}')classPrentice(Master):def__init__(self):self.wugong='闪电五连鞭'deffunc(self):print(f'身怀绝技:{self.wugong}')deffunc1(self):Master.__init__(self)#调用父类的初始化方法Master.func(self)deffunc2(self):self.func()zhangsan=Prentice()zhangsan.func1()zhangsan.func2()123456789101112131415161718192021222324'运行运行当我们在子类中调用父类的初始化方法或者方法的时候,函数的参数列表必须加上self,否则就会报错。当我们在子类中先调用父类的属性和方法的时候,再调用同名的子类自己的方法的时候,如果没有先调用子类自己的初始化方法,我们会发现会使用父类的属性和方法。deffunc2(self):self.__init__()self.func()zhangsan=Prentice()zhangsan.func1()zhangsan.func2()1234567我们还可以使用super()来调用父类的方法和属性。但是这种super()只能调用子类的直接父类,不能调用简介的父类,如果想要调用简介父类,需要在直接父类的方法中使用super()super(当前类名,self).函数名1当然super里面的参数也可省略。classMaster():def__init__(self):self.wugong='太极'deffunc(self):print(f'身怀绝技:{self.wugong}')classPrentice(Master):def__init__(self):self.wugong='闪电五连鞭'deffunc(self):print(f'身怀绝技:{self.wugong}')deffunc1(self):super().__init__()super().func()zhangsan=Prentice()zhangsan.func1()#身怀绝技:太极123456789101112131415161718192021'运行运行使用super()后面的函数参数列表不需要条件self多层继承多层继承是指一个子类继承自另一个子类,而该子类又继承自另一个父类的情况。通过多层继承,可以在类之间形成层次结构,使得子类可以继承和重用祖先类的属性和方法。#定义基类AclassA:defmethod_A(self):print("ThisismethodA")#定义中间类B,继承自基类AclassB(A):defmethod_B(self):print("ThisismethodB")#定义子类C,继承自中间类BclassC(B):defmethod_C(self):print("ThisismethodC")1234567891011121314'运行运行在上述代码中,类A是基类,类B继承自基类A,类C继承自中间类B。这样,类C就拥有了自己的方法method_C,以及继承自类B和类A的方法method_B和method_A。通过多层继承,实例化类C的对象,我们既可以调用method_C方法,也可以调用从类B和类A继承而来的方法:obj=C()obj.method_C()#调用C类的方法obj.method_B()#调用B类的方法obj.method_A()#调用A类的方法1234ThisismethodCThisismethodBThisismethodA123需要注意的是,在进行多层继承时,我们要谨慎选择继承关系,以避免出现复杂和难以维护的继承链。合理设计继承关系能够提高代码的可读性和可维护性,同时也要注意避免过度依赖继承,以免造成耦合性过高的问题。私有权限父类继承给子类,可以选择性的继承,可以选择有的东西不继承,这些不继承的事物可以被设置成私有权限,私有权限只能在当前类中访问和修改,就算是该类的子类也不能使用。在python中,如果我们想设置私有权限,可以使用连个下划线来修饰方法名或者属性__xxclassMaster():def__init__(self):self.wugong='太极'self.__name='lisi'deffunc(self):print(f'身怀绝技:{self.wugong}')classPrentice(Master):def__init__(self):self.wugong='闪电五连鞭'deffunc(self):print(super().__name)3访问父类的私有权限zhangsan=Prentice()zhangsan.func()12345678910111213141516171819我们不能访问和修改父类中的私有权限但是呢,我们的父类可以提供接口来供子类或者其他类来获取和修改私有权限。我们通常使用get_xx来获取私有权限值,set_xx来修改私有权限值。classMaster():def__init__(self):self.wugong='太极'self.__name='lisi'deffunc(self):print(f'身怀绝技:{self.wugong}')defget_name(self):returnself.__namedefset_name(self,name):self.__name=namemaster=Master()print(master.get_name())master.set_name('wangwu')print(master.get_name())123456789101112131415161718'运行运行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 07:02 , Processed in 0.426565 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表