python的继承

1、继承、派生

什么是继承、派生

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

派生就是子类在继承父类的基础上衍生出新的属性。子类中独有的,父类中没有的;或子类定义与父类重名的东西。子类也叫派生类。

继承派生机制的作用

可以将一些共有功能加在基类中。实现代码的共享
在不改变基类的基础上改变原有的功能

继承说明

python3 任何类都直接或间接的继承自object类,object类是一切类的基类

2、单继承

语法:

class 类名(基类名):
    语句块

说明:

单继承是派生类的一个基类衍生出的新类

示例

# 此示例示意单继承的定义方法和用法
class Human():
    def say(self,str):
        print(str)
    def walk(self,distance):
        print("走了",distance,'公里')
class student(Human):
    def learn(self,subject):
        print("正在学习",subject)
s1 = student()
s1.say("我要去学校")
s1.walk(10)
s1.learn("Python")

3、__base__属性

类的__base__属性用来记录此类的基类

>>> Human.__base__
<class 'object'>
>>> print(object.__base__)
None

4、覆盖

什么是覆盖

覆盖是指在有继承关系的类中,子类中实现了与基类同名的方法,在子类的实例调用方法时,实际调用的时子类中的覆盖版本。称这种现象为覆盖

5、super 函数

super(cls,obj) ,返回绑定超类的实例(要求obj必须为cls类型的实例)
super() ,返回绑定超类的实例,等同于:super(当前子类名,首参).方法。首参:实例方法的第一个参数。这种方式必须在方法内调用

作用

借助supper()返回的实例间接调用父类的覆盖方法

示例

# 此示例示意用super函数间接调用父类中覆盖的方法
class A():
    def work(self):
        print('A的work')
class B(A):
    def work(self):
        print("B的work")
    def supper_work(self):
        # 调用自己的work方法
        self.work()
        # 调用父类的wrok
        super(B,self).work()
        super(self.__class__,self).work()
        super().work()      # 这种方法必须在实例方法内部,不能再别的地方用
b = B()
B.work(b)
super(B,b).work()
b.supper_work()

显示调用基类的初始化方法

当子类中实现了__init__方法,基类的构造方法不会被调用,此时需要显示调用

示例

# 此示例示意显示调用初始化方法
class Human():
    def __init__(self, n,a):
        self.name = n
        self.age = a
        print("Human 类的初始化方法被调用...")
    def infos(self):
        print("name:",self.name)
        print("age:",self.age)
class Student(Human):
    def __init__(self,n,a,s=0):
        super(Student,self).__init__(n,a)
        self.score = s
        print("Student类的初始化方法被调用...")
    def infos(self):
        super(Student,self).infos()     # 调用父类的方法
        print("score:",self.score)
s1 = Student('张飞',15,80)
s1.infos()

6、多继承

语法:

class 类名(基类名1,基类名2,……):

说明

一个子类同时继承自多个父类,父类中的方法可以同时被继承下来
如果父类中有同名的方法,而子类中有没有覆盖此方法时,调用结果难以确定

示例

class Car:
   def run(self,speed):
      print("汽车以",speed,"km/h的速度行驶")
class Plane:
   def fly(self,height):
      print("飞机在海拔",height,"米的高度飞行")
class PlaneCar(Car,Plane):
    '''同时拥有Car 和 Plane 的方法'''
p1 = PlaneCar()
p1.fly(10000)		# 飞机在海拔10000米的高度飞行
p1.run(100)	 		# 汽车以每小时100km/h的速度行驶

注意

多继承有标识符冲突问题,要谨慎使用多继承。在标识符冲突的时候,先继承谁就执行谁的。但是继承的越多,冲突问题就越大,程序就越不稳定。

7、多继承的 MRO(Method Resolution Order)问题

类的 mro 属性作用:用来记录类的方法查找顺序
super() 函数就是根据 mro 来调用上层的方法的

class A:
    def go(self):
        print("A")
class B(A):
    def go(self):
        print("B")
        super().go()
class C(A):
    def go(self):
        print("C")
        super().go()
class D(B,C):
    def go(self):
        print("D")
        super().go()
d = D()
d.go()

输出(先继承谁,就先找谁)

D
B
C
A
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值