最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

零基础学Python继承——子承父类

XAMPP案例 admin 373浏览 0评论

0Python

今天我们主要来介绍“继承”,这是类的一个很重要的功能。

什么是继承呢?就是说当你定义了一个类后,如果我希望有一个新的类,可以拥有之前类的所有属性和方法,同时也能创建自己的属性和方法。

此时,这个新的类就叫做子类,之前的类就叫做父类,将父类的属性和方法“复制”到子类中的这个动作就叫做继承。也就是说,子类既有和父类的“共性”,又有自己的“个性”。

1

多说无益,我们先来看一个例子:

class Bike:
    def __init__(self,model,year):
        self.model = model
        self.year = year
        self.distance = 0
    def dis(self):
        print(f'The {self.model} has {self.distance} km on it.')
    def update_dis(self,km):
        if km >= self.distance:
            self.distance = km
        else:
            print("Wrong behavior!")

class Mountain_bike(Bike):
    def __init__(self,model,year):
        super().__init__(model,year)

在这段代码中,我们先定义了一个父类Bike,然后又定义了一个子类Mountain_bike,希望能继承父类。因此,在子类后要加一个括号,里面写上父类的名字。这里我们的父类是自行车,而子类是山地车,山地车是自行车的一种。

之后,定义调用子类时自动运行的方法__init__,因为我们想继承父类,所以super()就表示继承的含义,它表示调用父类的方法。super是superclass(超类)的简写,因此父类又被称为超类。

我们希望继承父类的属性,因此后面要跟__init__方法,但里面的参数就不用写self了,这里只表示继承关系。

将子类实例化后,它就可以调用父类的属性和方法了,比如:

new_bike = Mountain_bike('XC',2021)
new_bike.dis()

输出结果为:

The XC has 0 km on it.

2

当然,子类也可以拥有自己的属性和方法,让我们给之前的Mountain_bike添加一些吧:

class Mountain_bike(Bike):
    def __init__(self,model,year):
        super().__init__(model,year)
        self.transmission = 27
    def speed_changer(self):
        print(f"The {self.model} has {self.transmission} shifting.")

注意第4行代码,我们给子类添加了一个transmission的属性,它表示山地车的速别,这里默认是27速。

然后又添加了一个speed_changer的方法,打印当前型号山地车的速别。

我们将其实例化,调用子类的新方法看下:

new_bike = Mountain_bike('XC',2021)
new_bike.speed_changer()
The XC has 27 shifting.

 

3

有时候父类的方法可能过时了,不再适合所有子类,这时你可以在子类中重写父类的方法。

具体的操作是,在子类中定义一个和父类方法完全相同的名字,然后写入新的内容:

class Mountain_bike(Bike):
    def __init__(self,model,year):
        super().__init__(model,year)
        self.transmission = 27
    def speed_changer(self):
        print(f"The {self.model} has {self.transmission} shifting.")
    def update_dis(self): #和父类方法同名
        print('You can not do this!')

注意第7行,当你定义了一个和父类完全相同的方法时,在子类实例化之后,如果调用该方法,那么将使用子类中的定义,而覆盖掉原先父类中的定义。我们将其实例化,看下结果:

new_bike = Mountain_bike('XC',2021)
new_bike.update_dis()
You can not do this!

4

有时候你会发现有些子类的方法是类似,你可以把它们提取出来,作为一个新的类。同时,新类的实例也可以作为属性应用到原来的类中。

比如山地车都有速别这个属性,那么我可以将其单独创建一个类:

class Transmission:
    def __init__(self,transmission = 27):
        self.transmission = transmission
    def speed_changer(self):
        print(f"The bike has {self.transmission} shifting.")

我可以在山地车这个类中,将Transmission实例化,作为其属性:

class Mountain_bike(Bike):
    def __init__(self,model,year):
        super().__init__(model,year)
        self.trans = Transmission() #实例用作属性

注意第4行代码,新类被实例化,赋给了属性trans,这意味着该属性可以调用Transmission类中的所有属性和方法。比如下面这样:

new_bike = Mountain_bike('XC',2021)
new_bike.trans.speed_changer()

看下结果:

The bike has 27 shifting.

关于类的内容,终于介绍完了,你都get到了吗?

转载请注明:XAMPP中文组官网 » 零基础学Python继承——子承父类

您必须 登录 才能发表评论!