Python类的继承

每次编写类的时候,并不是一定要从头开始写代码,新类可以通过继承从已有的类中自动获得已有的属性和方法,这个过程叫作继承;已有的类称为父类,而新类称为子类。

子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。继承这个术语还是比较形象的,就好像我们从父母那里继承了他们身上的某种特点,如黑头发、黑眼睛、黄皮肤。

子类的定义和普通类略有不同。我们通过一个例子来看一下,假设要为斑点狗定义一个类 SpottedDog,它是上一节介绍过的Dog类的子类。我们定义的子类的名称是 SpottedDog,然后在类名后面的括号中加入父类的名字 Dog,表示它是从 Dog 类继承而来的新类。

我们为这个新类定义了新的属性和新的方法,下面突出显示新创建的子类 SpottedDog 的代码。
class Dog:   
    legs=None
    age=None   
    isCute=None  
    def __init__(self,name,gender):
        self.name=name
        self.gender=gender
    def Hello(self):
        print("Woof...Woof")
        print("My name is "+self.name+".")
        print("I am a "+self.gender+".")
        print("I want to play with you.")
class SpottedDog(Dog):
    isLarge=None
    def Character(self):
        print("I am a spotted dog.")
        if self.isLarge==True:
            print("I am a large dog.")
我们为 SpootedDog 类定义了一个新的属性 isLarge 和一个新的方法 Character()。在 Character() 方法中,判断 isLarge 属性是否等于 True,如果该属性等于 True,会打印 "I am a large dog."。

我们创建 Dog 类的实例时,构造方法还是会提醒我们要输入参数 name 和 gender,因为继承了父类的 __init__() 方法,如图 1 所示。

python类的继承
图 1

我们为 SpottedDog 类创建了一个实例 dog3,指定这只小狗的名字为“Lucky”,它是一个“Boy”。然后为它的 isLarge 属性赋值为 True,接下来,调用父类的 Hello() 方法和子类的 Character() 方法,如图 2 所示。

python类的继承
图 2

我们看到子类 SpottedDog 既继承了 Dog 类的属性和方法,又拥有自己的属性和方法。我们还可以增加 SpottedDog 类自己的 __init__() 方法,下面突出显示了修改过的代码。
class SpottedDog(Dog):  
    isLarge=None
    def __init__(self,name,gender,spots):
        super().__init__(name,gender)
        self.spots=spots
    def Character(self):
        print("I am  a spotted dog.")
        if self.isLarge==True:
            print("I am a large dog")
        print("I have "+ str(self.spots) +" spots in my body.")

在 SpottedDog 类的 __init__() 方法中,我们用到了一个特殊的函数 super(),它的功能是将父类和子类关联起来,从而可以调用父类的 __init__() 方法。我们还在这个构造方法中增加了一个新的属性 spots,所以再创建 SpottedDog 类的实例时,需要为构造方法指定 3 个参数,如图 3 所示。

python类的继承
图 3

为 SpottedDog 类创建一个新的实例 dog4。在构造方法中指定它的 3 个参数,分别是“Happy”表示名称,“Boy”表示性别,“30”表示斑点数,如图 4 所示。

python类的继承
图 4
 
当再次调用 Character() 方法时,就可以看到,传递给构造方法的参数已经作为 spots 属性的值在使用了。