python面向对象之继承与派生类

面向对象之继承

含义

在现实生活中,继承是用来描述人与人之间资源的从属关系的,比如儿子继承父亲,可以获得父亲的一切。
在面向对象中,继承则是用来描述类与类之间数据的从属关系,比如类A继承了类B 那么类A就可以使用类B中所有的数据或功能。

目的

面向对象中通过继承可以减少代码冗余,提升开发效率,可以继承单个类或多个类。

基本使用

类A继承类B

class A(B):
    pass

类A继承类B、类C、类D

class A(B, C, D):
    pass

继承的本质

继承的本质就是抽象。

提取子类的共同特征得到父类的过程叫做抽象。

image

由抽象的结果得到继承关系

image

比如现在由一个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]
"""

image

posted @ 2022-04-07 17:20  Yume_Minami  阅读(159)  评论(0编辑  收藏  举报