Python 面向对象之继承

发布时间:2024年01月13日

目录

概述

继承的作用

缺点

单继承实现

设置person类

创建子类学生类

实例化student类

创建worker子类

实例化worker类

子类独有属性

父类私有属性

子类构造函数修改

实例化子类

多继承实现

创建基类

创建父亲类

创建母亲类

创建子类

引入基类

创建子类并继承基类

调用继承类的方法

总结


?

概述

在我们创建类时,类名称旁边的小括号中,一般填写object(这并不是随便写的)。

Object类是所有类的父亲,还可称为基类或超类。

继承:有两个类,A类和B类,当我们说A类继承自B类时,

那么A类就拥有了B类中的所有属性和方法。

注意:继承者称为子类,被继承的类称为父类

继承的作用

  1. 简化了代码,减少冗余
  2. 提高代码的健壮性
  3. 提高了代码的安全性
  4. 是多态的前提

缺点

降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;

增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大段的代码需要重构。

降低代码的灵活性。耦合与内聚是描述类与类之间的关系。耦合性越低内聚性越高代码越好。

单继承实现

设置person类

创建一个基类person类,设置拥有名称、年龄属性,并且有吃和跑两种行为。

示例如下:

class Person(object):
    name = ''
    age = 0

    def __init__(self, name, age):
        # 赋值
        self.name = name
        self.age = age

    def eat(self, food):
        print('开始吃%s' % food)

    def run(self):
        print('开始跑步')

创建子类学生类

创建student类继承person类

需要引入person类,在构造函数中使用super继承父类的init。

示例如下:

from Person import Person


class Student(Person):
    def __init__(self, name, age):
        # 调用父类的init方法 需要传递相应参数
        super().__init__(name, age)

实例化student类

实例化学生类后,可以调用父类的方法。

示例如下:

from Student import Student

stu = Student('张三', 18)
stu.eat('果冻橙')
stu.run()

# 执行结果
# 开始吃果冻橙
# 开始跑步

创建worker子类

创建worker类继承person类

还是需要引入person类,在构造函数中使用super继承父类的init。

示例如下:

from Person import Person


class Worker(Person):

    def __init__(self, name, age):
        super().__init__(name, age)

实例化worker类

实例化worker类后,也去调用父类的方法。

只要是继承Person类的都可以调用父类设置的方法。

示例如下:

from Student import Student
from Worker import Worker

stu = Student('张三', 18)
stu.eat('果冻橙')
stu.run()

work = Worker('李四', 20)
work.eat('面条')
work.run()

子类独有属性

子类也可以在继承原有父类的基础上拥有自己独有的属性。

比如在学生类中增加该学生的成绩分数。

示例如下:

from Person import Person


class Student(Person):
    def __init__(self, name, age, score):
        # 调用父类的init方法 需要传递相应参数
        super().__init__(name, age)

        # 赋值分数
        self.score = score

实例化时增加分数

示例如下:

from Student import Student
from Worker import Worker

stu = Student('张三', 18, 100)
stu.eat('果冻橙')
stu.run()
print(stu.score)

# 执行结果
# 开始吃果冻橙
# 开始跑步
# 100

父类私有属性

设置父类的私有属性,尝试子类是否能继承。

示例如下:

class Person(object):
    name = ''
    age = 0

    # 私有属性
    __money = 100

    def __init__(self, name, age, money):
        # 赋值
        self.name = name
        self.age = age
        self.__money = money
print(self.__money)

        
    def get_money(self):
        return self.__money

    def set_money(self, money):
        if money <= 0:
            money = 0
        self.__money = money

?

子类构造函数修改

在Student类构造函数中增加money属性传递。

示例如下:

from Person import Person


class Student(Person):
    def __init__(self, name, age, score, money):
        # 调用父类的init方法 需要传递相应参数
        super().__init__(name, age, money)

        # 赋值分数
        self.score = score

实例化子类

实例化学生类,并且调用set_money 和 get_money方法,执行后查看结果。

示例如下:

from Student import Student

stu = Student('张三', 18, 100, 1000)

stu.set_money(200)
print(stu.get_money())

# 执行结果
# 1000
# 200

通过查看结果可得出:子类没有继承父类的私有属性;

通过子类继承的公共方法访问私有属性,访问的是子类的私有属性,而不是父类的。

多继承实现

创建基类

创建父亲类

设置一个run和test类方法,在构造函数中赋值一个money属性。

示例如下:

class Father(object):
    def __init__(self, money):
        self.money = money

    def run(self):
        print('跑')

    def test(self):
        print('测试1')

?

创建母亲类

母亲类中有eat和test类方法,为了与父亲类做区别,在构造函数中赋值一个新的属性。

示例如下:

class Mother(object):
    def __init__(self, new_value):
        self.new_value = new_value

    def eat(self, food):
        print('吃%s' % food)

    def test(self):
        print('测试2')

创建子类

引入基类

将基类引入到当前子类的命名空间中。

示例如下:

from Father import Father
from Mother import Mother

创建子类并继承基类

创建子类并继承父类和母类,需要在构造函数中传递父类和母类构造函数需要的参数。

示例如下:

from Father import Father
from Mother import Mother


class Child(Father, Mother):
    def __init__(self, money, new_value):
        Father.__init__(self, money)
        Mother.__init__(self, new_value)

调用继承类的方法

多继承类实例化并调用父类方法。

示例如下:

from Child import Child

if __name__ == '__main__':
    child = Child(100, 200)
    child.run()
    child.eat('香蕉')
    child.test()

执行结果:

跑
吃香蕉
测试1

通过执行结果可以发现继承的父类和母类中的方法都可以使用;

但是当父类和母类中方法名相同,默认调用的是在括号中排前面的父类中的方法。

总结

本篇为Python面向对象的继承概念和示例内容学习笔记。

文章来源:https://blog.csdn.net/json_ligege/article/details/135576280
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。