引言
虽然本人以前总是使用类去写 Python
代码,但是对于模块化确实仍不是特别熟悉,相信有不少小伙伴都会和我一样对 Python
类的继承比较困惑。于是,今天,我决定对它正式动手了。本文我们会着重说明以下四个问题:
- 我们为什么需要使用
Python
类的继承 - 单继承
- 继承中的各种书写形式
- 多继承
单继承
示例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
单继承最常用的用法,也是推荐使用的方法。
现在我们可以回答第一个问题了,我们为什么要使用类继承呢?
- 可以使得我们省略很多不必要的代码,使得代码更加简洁。
- 使得我们定义类对象的性质,且定义子类与父类的关系更加鲜明。
- 可以使得我们在子类中调用父类中的方法。
- 可以更好的实现代码的模块化。(大工程文件必备)
当然上述代码也有其他书写形式。
示例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
类进行了扩展。
注意当我们使用第四种形式的时候,会报错,具体原因,暂时不明,前三种形式是可以的。
多继承
即,一个子类从多个父类中继承,通常用不到,这里暂时不做说明,日后如果作者能够遇到,会再来补充。
如果大家觉得有用,就点个赞让更多的人看到吧~