python 继承和派生

python内建的类查看: >>> help(__builtins__)

1、继承 inheritance / 派生 derived

  【1】 继承是指从已有的类中派生出新的类,新类具有原类的行为,并能扩展新的行为

  【2】 派生类就是从一个已有类中衍生成新类,在新类上可以添加新的属性和行为  

2、作用

  【1】用继承派生机制,可以将一些共有功能加在基类中,实现代码的共享

  【2】在不改变基类的代码的基础上改变原有的功能

  继承是延续旧类的功能,派生是在旧类的基础上添加新功能

3、

  【1】基类(base class) /超类(super class)/ 父类(father class)

  【2】派生类(derived class) / 子类(child class)

4、单继承

  【1】单继承是指由一个基类衍生出新的类

  【2】python3 任何类都直接或间接的继承自object类 object 类是一切类的超类

  class 类名(基类名):

    pass  

# 此示例示意单继承的用法:
class Human:  # 人类的共性
    def say(self, what):
        print("say:", what)

    def walk(self, distance):  # 走路
        print("走了", distance, '公里')

class Student(Human):
    def study(self, subject):
        print("正在学习:", subject)

class Teacher(Student):
    '''说话,行走,教学'''
    def teach(self, subject):
        print("正在教:", subject)

h1 = Human()
h1.say('天气晴了')
h1.walk(5)
print('---------------')
s1 = Student()
s1.walk(4)
s1.say('感觉有点累')
s1.study('Python')
print('===============')
t1 = Teacher()
t1.walk(6)
t1.say('吃点啥好呢')
t1.teach('面向对象')
t1.study('转魔方')
class Skill:
    def fire(self):
        print("release Fire skill")

class Riven:
    camp='Noxus'
    def __init__(self,nickname):
        self.nickname=nickname
        self.skill5=Skill().fire()#Skill类产生一个对象,并调用fire()方法,赋值给实例的skill5属性

r1=Riven("瑞雯")

5、覆盖 override

  覆盖是指在有继承关系的类中,子类中实现了与基类同名的方法,在子类的实例调用该方法时,

  实际调用的是子类中的覆盖版本,这种现象叫做覆盖。 

In [161]: # 此示例示意B类的works方法覆盖A类的works方法
     ...: class A:
     ...:     def works(self):
     ...:         print("A.works被调用")
     ...:
     ...:
     ...: class B(A):
     ...:     ''' B类继承自A类'''
     ...:     def works(self):
     ...:         print("B.works被调用")
     ...:
     ...:
     ...: b = B()
     ...: b.works()  # 调用B类的works
     ...:
     ...: a = A()
     ...: a.works()  # 调用A类的works
B.works被调用
A.works被调用
In [162]: # 此示例示意B类的works方法覆盖A类的works方法
     ...: class A:
     ...:     def works(self):
     ...:         print("A.works被调用")
     ...:
     ...:
     ...: class B(A):
     ...:     ''' B类继承自A类'''
     ...:     def works(self):
     ...:         print("B.works被调用")
     ...:
     ...:
     ...: b = B()
     ...: b.works()  # B.works被调用
     ...: A.works(b)  # 用类名显式调用A类的works, A.works被调用
     ...:
B.works被调用
A.works被调用

6、子类调用父类中的重名方法

  【1】子类对象显式调用基类(被覆盖)方法的方式:

    基类名.方法名(实例, 实际调用传参)

  【2】super().方法名(参数)  #只能在方法内使用

  【3】super(子类名,子类实例).方法名(参数)

7、super函数

   用于在子类中调用父类中被覆盖的方法

   super(cls, obj)

      cls,子类名。obj,子类的实例

      返回绑定超类的实例

   super()

      返回绑定超类的实例,等同于: super(__class__, 实例方法的第一个参数), 必须在方法内调用

     【作用】: 借助super() 返回的基类的实例间接调用其父类的覆盖方法

In [165]: # 此示例示意用super函数返回的对象调用父类的覆盖方法
     ...: class A:
     ...:     def works(self):
     ...:         print("A.works被调用")
     ...:
     ...: class B(A):
     ...:     ''' B类继承自A类'''
     ...:     def works(self):
     ...:         print("B.works被调用")
     ...:
     ...:     def super_work(self):
     ...:         self.works()  # B.works被调用
     ...:         super(B, self).works()  # A.works被调用
     ...:         super().works()  # A.works被调用
     ...:
     ...:
     ...: b = B()
     ...: b.works()  # B.works被调用
     ...: super(B, b).works()  # A.works被调用
     ...: b.super_work()  # ...
     ...: # super().works() # 出错,只能在方法内调用
     ...: A.works(b)
     ...:
B.works被调用
A.works被调用
B.works被调用
A.works被调用
A.works被调用
A.works被调用

8、继承中的初始化方法

  当子类中实现了 __init__ 方法,

  基类的初始化方法并不会被调用 def __init__(self, ...)

In [166]: # 此示例示意 用super函数显示调用基类__init__初始化方法
     ...: class Human:
     ...:     def __init__(self, n, a):
     ...:         self.name, self.age = n, a
     ...:         print("Human的__init__方法被调用")
     ...:
     ...:     def infos(self):
     ...:         print("姓名:", self.name)
     ...:         print("年龄:", self.age)
     ...:
     ...:
     ...: class Student(Human):
     ...:     def __init__(self, n, a, s=0):
     ...:         super().__init__(n, a)  # 显式调用父类的初始化方法
     ...:         self.score = s  # 添加成绩属性
     ...:         print("Student类的__init__方法被调用")
     ...:
     ...:     def infos(self):
     ...:         super().infos()  # 调用父类的方法
     ...:         print("成绩:", self.score)
     ...:
     ...:
     ...: s1 = Student('小张', 20, 100)
     ...: s1.infos()
Human的__init__方法被调用
Student类的__init__方法被调用
姓名: 小张
年龄: 20
成绩: 100

 

 

posted @ 2020-12-31 13:51  昱成  阅读(341)  评论(0编辑  收藏  举报