Python 类继承详解

引言

虽然本人以前总是使用类去写 Python 代码,但是对于模块化确实仍不是特别熟悉,相信有不少小伙伴都会和我一样对 Python 类的继承比较困惑。于是,今天,我决定对它正式动手了。本文我们会着重说明以下四个问题:

  1. 我们为什么需要使用 Python 类的继承
  2. 单继承
  3. 继承中的各种书写形式
  4. 多继承

单继承

示例1

我们将第一个,第二个问题以及第三个问题放在一起说明,先看一段代码:

class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return 2 * self.length + 2 * self.width


# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)


square = Square(4)
print(square.area())
"""
result:
16
"""

可以看到我们通过类的继承使用 Rectangle 类中的 area() 的方法计算了 Square 的面积。那这个计算过程是如何发生的呢?首先,定义好 square 类后,我们通过 def __init__(self, length): 定义了 square 类的初始化类,紧接着我们使用super().__init__(length, length)Rectangle 类中继承了它的初始化方法和类方法。其中的,super() 表示 Square 类的父类,即 Rectangle 类。length,length 表示 Rectangle 类中的初始化方法中的两个参数 length,width 此时用 length, length 替换。最后我们调用 area() 方法,而此时的 area() 方法中的参数已经均成了 length, length,最后我们得到 4 * 4 = 16

上述即是 Python 单继承最常用的用法,也是推荐使用的方法

现在我们可以回答第一个问题了,我们为什么要使用类继承呢?

  1. 可以使得我们省略很多不必要的代码,使得代码更加简洁。
  2. 使得我们定义类对象的性质,且定义子类与父类的关系更加鲜明。
  3. 可以使得我们在子类中调用父类中的方法。
  4. 可以更好的实现代码的模块化。(大工程文件必备)

当然上述代码也有其他书写形式。

示例2

class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return 2 * self.length + 2 * self.width


# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        Rectangle.__init__(self, length, length)


square = Square(4)
print(square.area())
"""
result:
16
"""

之前我们提到,super() 实际指代的是 Rectangle 类,因此,我们也可以直接使用 Rectangle.__init__(self, length, length) 来实现类的继承操作。但是需要注意不同于使用 super(),使用 Rectangle.__init__(self, length, length) 时,我们需要将第一个参数设置为 self

示例3

class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return 2 * self.length + 2 * self.width


# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super(Square, self).__init__(length, length)


square = Square(4)
print(square.area())
"""
result:
16
"""

如之前所说,super() 指代的是 Rectangle 类,然后紧跟着的括号中的第一个参数是当前类的名称,即 Square,然后对应的是 Square 类的实例对象,即 self

示例4

class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return 2 * self.length + 2 * self.width


# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super(self.__class__, self).__init__(length, length)


square = Square(4)
print(square.area())
"""
result:
16
"""

可以看到,上述中,我们将 super() 括号中的第一个参数由 super 换成了 self.__class__。事实上,此时的 self.__class__ 指代的就是 square 类。

至此,Python 类单继承的所有常见形式都被提及了。

类扩展

在之前的字类 Square 的基础上,采用类继承我们可以实现类的扩展。

class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return 2 * self.length + 2 * self.width


class Square(Rectangle):
    def __init__(self, length):
        super(Square, self).__init__(length, length)


class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length


cube = Cube(3)
print(cube.surface_area())
print(cube.volume())
"""
result:
54
27
"""

如上述代码所示,我们通过创建 Cube 类对 Square 类进行了扩展。

注意当我们使用第四种形式的时候,会报错,具体原因,暂时不明,前三种形式是可以的。

多继承

即,一个子类从多个父类中继承,通常用不到,这里暂时不做说明,日后如果作者能够遇到,会再来补充。

如果大家觉得有用,就点个赞让更多的人看到吧~

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的大熊猫

你的鼓励将是我写作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值