Python 中的继承

原文:https://www.studytonight.com/python/inheritance-in-python

继承面向对象编程最重要的方面之一。在编程时,很多时候会出现这样的情况:我们必须编写一些具有一些共同特性和一些独特的、特定于类的特性的类,这些特性包括变量和方法。

在这种情况下,按照面向对象编程,我们可以取出公共部分并将其放在一个单独的类中,并使所有其他类继承这个类,以使用它的方法和变量,从而减少一次又一次地重写每个类中的公共特性。

继承另一个类的类一般称为子类,而被其他类继承的类称为父类

当然,您必须仅将此用于相关的类,例如,您可以定义一个类living organic,其中定义了一个生物的所有基本特征,如呼吸、进食等。现在这个类很容易被另一个类动物人类重用,因为这两个类都有相同的特性。

此外,有时,继承用于通过将功能分解为核心特性和次要特性,将具有大量变量和方法的大类简化为更小的类。核心特性通常保存在父类中。


继承的语法

如果我们有一个类Parent和另一个类Child,并且我们希望类Child继承类Parent,那么

# Parent class
class Parent:
    # class variable
    a = 10;
    b = 100;
    # some class methods
    def doThis();
    def doThat();

# Child class inheriting Parent class
class Child(Parent):
    # child class variable
    x = 1000;
    y = -1;
    # some child class method
    def doWhat();
    def doNotDoThat();

通过在括号中指定另一个类的名称,在声明一个类时,我们可以指定继承。在上例中,Parent的所有属性都将继承给Child类。这样,类Parent中定义的所有方法和变量也成为了Child类的一部分。


举个例子

举个简单的例子。动物可以分为多种类型,如爬行动物、哺乳动物、两栖动物等。虽然它们在生理和生物学上都有所不同,但它们之间有许多共同的特征。所以现在我们定义一个名为 Animal 的父类,它会有一些与动物相关的基本属性和功能。

然后我们将为各种其他类型定义类,所有这些类也将继承类 Animal

这里有Animal课。

class Animal:
    # properties
    multicellular = True
    # Eukaryotic means Cells with Nucleus
    eukaryotic = True

    # functions
    def breath();
    def feed();

现在让我们为哺乳动物定义一个类。由于哺乳动物是温血动物,为婴儿产奶等,因此我们的Mammal类看起来像,

class Mammal(Animal):
    # properties
    haveMammaryGland = True;
    def warmBlood = True;

    # functions
    def produceMilk();

如果我们也想为Amphibians创建另一个类,那么

class Amphibian(Animal):
    # properties
    liveInWater = True;

    # functions
    def metamorphosis();

由于类MammalsAmphibian都继承了类Animal,因此它们将具有类Animal中定义的属性和函数。

因此,现在任何Amphibian类的物体,比如青蛙,都将具有属性:multicellular(来自动物类)、eukaryotic(来自动物类)、liveInWater(来自两栖类),并且能够breath()feed()和做metamorphosis()

而这一切又如何能写成代码,如果我们创建一个对象,比如青蛙:

>>> Amphibian Frog = Amphibian()
>>> Frog.breath();   # calling function defined in Animal class
>>> Frog.metamorphosis();    # calling function defined in Amphibian class
>>> print (Frog.liveInWater)

真实的


使用继承的好处

以下是在程序中使用继承的几个主要优点。

  1. 减少代码重复,因为常见的代码可以放在父类中,因此所有子类都可以使用它。
  2. 结构化代码:通过将代码划分为类,我们可以通过将功能划分为类来更好地构建我们的软件。
  3. 使代码更具可伸缩性。

访问子类中的父类元素

在子类中工作时,在某些时候,您可能必须使用父类的属性或函数。为了访问父类的元素,可以使用点.操作符。

Parent.variableName

上面提到了如何访问变量,或者如果需要调用父类的函数,

Parent.functionName()

其中Parent是我们父类的名字,variableNamefunctionName()分别是它的变量和函数。

下面是一个例子,我们有一个简单的例子来说明这一点:

class Parent:
      var1 = 1
      def func1(self):
          # do something here

class Child(Parent):
      var2 = 2
      def func2(self):
        # do something here too
          # time to use var1 from 'Parent'
          myVar = Parent.var1 + 10
          return myVar