关于python:Python-116Python手把手教程之类Class的继承父类子类

38次阅读

共计 2842 个字符,预计需要花费 8 分钟才能阅读完成。

作者 | 弗拉德
起源 | 弗拉德(公众号:fulade_me)

继承

编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的非凡版本,可应用 继承。一个类继承另一个类时,它将主动取得另一个类的所有属性和办法; 原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和办法,同时还能够定义本人的属性和办法。

子类的办法__init__()

创立子类的实例时,Python 首先须要实现的工作是给父类的所有属性赋值。为此,子类的办法 __init__() 须要继承父类的办法。
例如,上面来模仿电动汽车。电动汽车是一种非凡的汽车,因而咱们能够在后面创立的 Car 类的根底上创立新类 ElectricCar,这样咱们就只需为电动汽车特有的属性和行为编写代码。
上面来创立一个简略的 ElectricCar 类版本,它具备 Car 类的所有性能:

class Car(): 
    """一次模仿汽车的简略尝试"""
    def __init__(self, make, model, year): 
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    def get_descriptive_name(self):
        long_name = str(self.year) + '' + self.make +' ' + self.model 
        return long_name.title()

    def read_odometer(self):
        print("This car has" + str(self.odometer_reading) + "miles on it.")

    def update_odometer(self, mileage):
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage 
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self, miles): 
        self.odometer_reading += miles


class ElectricCar(Car): 
    """电动汽车的独特之处"""
    def __init__(self, make, model, year): 
        """初始化父类的属性"""
        super().__init__(make, model, year) 
        
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())

首先是 Car 类的代码。创立子类时,父类必须蕴含在以后文件中,且位于子类后面。接着咱们定义了子类ElectricCar。定义子类时,必须在括号内指定父类的名称。办法__init__() 承受创立 Car 实例所需的信息。

ElectricCar外部的 super() 是一个非凡函数,帮忙 Python 将父类和子类关联起来。这行代码让 Python 调用 ElectricCar 的父类的办法 __init__(),让ElectricCar 实例蕴含父类的所有属性。父类也称为超类(superclass),名称 super 因而而得名。

接下来咱们测试一下继承的作用,咱们尝试创立一辆电动汽车,但提供的信息与创立一般汽车时雷同。咱们创立 ElectricCar 类的一个实例,并将其存储在变量 my_tesla 中。这行代码调用 ElectricCar 类中定义的办法 __init__(),后者让 Python 调用父类 Car 中定义的办法 __init__()。咱们提供了实参 ’tesla’、’model s’ 和 2016。
除办法 __init__() 外,电动汽车没有其余特有的属性和办法。以后,咱们只想确认电动汽车具备一般汽车的行为,输入后果如下:

2016 Tesla Model S

ElectricCar 实例的行为与 Car 实例一样,当初能够开始定义电动汽车特有的属性和办法了。

给子类定义属性和办法

让一个类继承另一个类后,可增加区分子类和父类所需的新属性和办法。
上面来增加一个电动汽车特有的属性(电瓶),以及一个形容该属性的办法。咱们将存储电瓶容量,并编写一个打印电瓶形容的办法:

class ElectricCar(Car):
    def __init__(self, make, model, year):
        """电动汽车的独特之处 初始化父类的属性,再初始化电动汽车特有的属性"""
        super().__init__(make, model, year) 
        self.battery_size = 70
    def describe_battery(self): 
        """打印一条形容电瓶容量的音讯"""
        print("This car has a" + str(self.battery_size) + "-kWh battery.")

my_tesla = ElectricCar('tesla', 'model s', 2016) 
print(my_tesla.get_descriptive_name()) 
my_tesla.describe_battery()

咱们增加了新属性 self.battery_size,并设置其初始值。依据ElectricCar 类创立的所有实例都将蕴含这个属性,但所有 Car 实例都不蕴含它。咱们还增加了一个名为 describe_battery() 的办法,它打印无关电瓶的信息。咱们调用这个办法时,将看到一条电动汽车特有的形容:

2016 Tesla Model S
This car has a 70-kWh battery.

对于 ElectricCar 类的特殊化水平没有任何限度。模仿电动汽车时,你能够依据所需的精确水平增加任意数量的属性和办法。如果一个属性或办法是任何汽车都有的,而不是电动汽车特有的,就应将其退出到 Car 类而不是 ElectricCar 类中。这样,应用 Car 类的人将取得相应的性能,而 ElectricCar 类只蕴含解决电动汽车特有属性和行为的代码。

重写父类的办法

对于父类的办法,只有它不合乎子类模仿的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的办法,即它与要重写的父类办法同名。这样,Python 将不会思考这个父类办法,而只关注你在子类中定义的相应办法。
假如 Car 类有一个名为 fill_gas_tank() 的办法,它对全电动汽车来说毫无意义,因而你可能想重写它。上面演示了一种重写形式:

def ElectricCar(Car):
    def fill_gas_tank():
        """电动汽车没有油箱"""
        print("This car doesn't need a gas tank!")

当初,如果有人对电动汽车调用办法fill_gas_tank(),Python 将疏忽 Car 类中的办法fill_gas_tank(),转而运行上述代码。应用继承时,可让子类保留从父类那里继承的有用的代码,用重写来笼罩不须要的代码。

本篇文章没有作业,下一篇咱们解说函数的高级用法


正文完
 0