Python 中的继承
2023-09-17 22:17:37
我们经常遇到具有基本模型和高级模型的不同产品,这些产品在基本模型之上添加了功能。 OOP 的软件建模方法可以扩展现有类构建新类的能力,而不是从头开始构建。 在 OOP 术语中,此特征称为继承,现有类称为基类或父类,而新类称为子类或子类。
当一个新类与现有类拥有"IS A"关系时,继承就会出现。
狗是一种动物。猫也是一种动物。因此,动物是基类,而狗和猫是继承类。
四边形有四个边。矩形是四边形,因此是正方形。四边形是基类(也称为父类),而矩形和正方形是继承的类 - 也称为子类。
子类从父类继承数据定义和方法。这有助于重用现有功能。 子类可以添加更多定义或重新定义基类方法。
此功能在为系统中的对象构建类层次结构时非常有用。还可以基于多个现有类设计新类。此功能称为多重继承。
建立继承的一般机制如下所示:
语法:class parent: statements class child(parent): statements
在定义子类时,父类的名称放在其前面的括号中,指示两者之间的关系。 父类中定义的实例属性和方法将由子类的对象继承。
为了演示一个更有意义的示例,首先定义了一个四边形类,并将其用作矩形类的基类。
下面定义了一个具有四个边作为实例变量和perimeter()
方法的四边形类:
class quadriLateral:
def __init__(self, a, b, c, d):
self.side1=a
self.side2=b
self.side3=c
self.side4=d
def perimeter(self):
p=self.side1 + self.side2 + self.side3 + self.side4
print("perimeter=",p)
q1=quadriLateral(7,5,6,4)
q1.perimeter()
构造函数(__init__()
方法)接收四个参数,并将它们分配给四个实例变量。若要测试上述类,请声明其对象并调用 perimeter()
方法。
我们现在基于 quadriLateral
类设计一个矩形类(矩形是四边形的!基类中的实例变量和 perimeter()
方法应自动可供其使用,而无需重新定义它。
由于矩形的相对边是相同的,我们只需要两个相邻的边来构造它的对象。因此,__init__()
方法的其他两个参数设置为 none。
__init__()
方法使用 super() 函数将参数转发到其基(四边形)类的构造函数。
对象使用 side3
进行初始化,side4
设置为 none。
相对的边由矩形类的构造函数相等。请记住,它已自动继承了 perimeter()
方法,因此无需重新定义它。
class quadriLateral:
def __init__(self, a, b, c, d):
self.side1=a
self.side2=b
self.side3=c
self.side4=d
def perimeter(self):
p=self.side1 + self.side2 + self.side3 + self.side4
print("perimeter=",p)
class rectangle(quadriLateral):
def __init__(self, a, b):
super().__init__(a, b, a, b)
r1=rectangle(10, 20)
r1.perimeter()
现在,我们可以声明矩形类的对象并调用 perimeter()
方法。
在 Python 中覆盖(Overriding in Python)
在上面的例子中,我们看到了在构造继承的类时如何重用基类的资源。但是,继承的类可以有自己的实例属性和方法。
父类的方法可用于继承的类。但是,如果需要,我们可以修改任何基类方法的功能。 为此,继承的类包含方法的新定义(具有相同的名称和基类中已存在的签名)。 当然,新类的对象将可以访问这两种方法,但来自其自身类的对象在调用时将具有优先权。这称为方法重写。
首先,我们将在矩形类中定义一个名为 area()
的新方法,并将其用作 square
类的基础。矩形的面积是其相邻边的乘积。
class quadriLateral:
def __init__(self, a, b, c, d):
self.side1=a
self.side2=b
self.side3=c
self.side4=d
def perimeter(self):
p=self.side1 + self.side2 + self.side3 + self.side4
print("perimeter=",p)
class rectangle(quadriLateral):
def __init__(self, a,b):
super().__init__(a, b, a, b)
def area(self):
a = self.side1 * self.side2
print("area of rectangle=", a)
让我们定义继承rectangle
类的方形类。重写 area()
方法以实现正方形面积作为其边的正方形的公式。
class square(rectangle):
def __init__(self, a):
super().__init__(a, a)
def area(self):
a=pow(self.side1, 2)
print('Area of Square: ', a)
s=square(10)
s.area() #output: Area of Square: 100
本文内容总结: