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

本文内容总结: