0
点赞
收藏
分享

微信扫一扫

Python 类继承详解

承蒙不弃 2023-05-07 阅读 70

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 类进行了扩展。

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

多继承

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

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

举报

相关推荐

0 条评论