python面向对象之继承与派生类
面向对象之继承
含义
在现实生活中,继承是用来描述人与人之间资源的从属关系的,比如儿子继承父亲,可以获得父亲的一切。
在面向对象中,继承则是用来描述类与类之间数据的从属关系,比如类A继承了类B 那么类A就可以使用类B中所有的数据或功能。
目的
面向对象中通过继承可以减少代码冗余,提升开发效率,可以继承单个类或多个类。
基本使用
类A继承类B
class A(B):
pass
类A继承类B、类C、类D
class A(B, C, D):
pass
继承的本质
继承的本质就是抽象。
提取子类的共同特征得到父类的过程叫做抽象。
由抽象的结果得到继承关系
比如现在由一个Student类和Teacher类
# Student类
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def study(self):
print(f'{self.name}正在学习')
# Teacher类
class Teacher:
def __init__(self, name, age):
self.name = name
self.age = age
def teach(self):
print(f'{self.name}正在讲课')
我们对Student类和Teacher类进行抽象,提取共同特征,得到Person类
# Person类
def Person:
def __init__(self, name, age):
self.name = name
self.age = age
所以可以把Student类和Teacher类继承Person类,不仅实现同样的效果,还节省了代码的编写。
# Person类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# Student类继承Person类
class Student(Person):
def study(self):
print(f'{self.name}正在学习')
# Teacher类继承Person类
class Teacher(Person):
def teach(self):
print(f'{self.name}正在讲课')
派生类
子类可以派生出自己新的属性,比如人有姓名和年龄,老师有姓名、年龄和职业。
# 父类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 子类
class Teacher(Person):
def __init__(self, name, age, job):
self.name = name
self.age = age
self.job = job
这里明显有着重复的代码,我们可以使用super关键字去掉重复的代码。
# 父类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 子类
class Teacher(Person):
def __init__(self, name, age, job):
# 完整的语法:super(Teacher,self).__init__(name,age)
super().__init__(name, age)
self.job = job
这两个代码示例有着同样的功能,但是下面的那个代码更加的简洁。
如果自己写的子类需要使用父类的方法,并且还需要基于该方法做扩展,这样的子类我们称之为派生类(本质还是子类)。super关键字就可以实现我们需求。
派生功能例子
使用派生类,我们可以在列表的方法上进行拓展。
比如我想要使用列表的append方法时无法append(123)
# 编写一个类继承列表
class MyClass(list):
# 重写方法
def append(self,args):
# 如果是123就直接返回
if args == 123:
print('数字123不能追加')
return
# 如果不是123就调用原有的list中的append方法
super(MyClass, self).append(args)
obj1 = MyClass()
obj1.append(333)
obj1.append(222)
obj1.append(123)
print(obj1)
"""
执行结果:
数字123不能追加
[333, 222]
"""