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.age = n, a
...: print("Human的__init__方法被调用")
...:
...: def infos(self):
...: print("姓名:", )
...: 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