作者|弗拉德来源|从空白开始。当您要编写的类是另一个现有类的专用版本时,请使用继承。当一个类继承另一个类时,它会自动获得另一个类的所有属性和方法;原来的类称为父类,新类称为子类。子类继承父类的所有属性和方法,也可以定义自己的属性和方法。当子类的方法__init__()创建子类的实例时,Python需要完成的第一个任务就是给父类的所有属性赋值。为此,子类的方法__init__()需要继承父类的方法。例如,让我们模拟一辆电动汽车。电动汽车是一种特殊的汽车,所以我们可以在前面创建的Car类的基础上新建一个类ElectricCar,这样我们只需要针对电动汽车特有的属性和行为编写代码即可。让我们创建一个简单版本的ElectricCar类,它具有Car类的所有功能:classCar():"""Asimpleattempttosimulateacar"""def__init__(self,make,model,year):self.make=makeself.model=modelself.year=yearself.odometer_reading=0defget_descriptive_name(self):long_name=str(self.year)+''+self.make+''+self.model返回long_name。title()defread_odometer(self):print("Thiscarhas"+str(self.odometer_reading)+"milesonit.")defupdate_odometer(self,mileage):如果里程>=self.odometer_reading:自我。odometer_reading=mileageelse:print("Youcan'trollbackanodometer!")defincrement_odometer(self,miles):self.odometer_reading+=milesclassElectricCar(Car):"""电动汽车的独特之处"""def__init__(self,make,model,year):"""初始化父类的属性"""super().__init__(make,model,year)my_tesla=ElectricCar('tesla','models',2016)打印(我的sla.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”、“models”和2016。除了方法__init__()之外,电动汽车没有其他特定的属性和方法。目前,我们只想确认电动汽车的行为与普通汽车一样。输出如下:2016TeslaModelSElectricCar实例的行为类似于Car实例。现在我们可以开始定义特定于电动汽车的属性和方法。为子类定义属性和方法一旦让一个类继承自另一个类,就可以添加区分子类和父类所需的新属性和方法。让我们添加一个电动汽车特定的属性(电池)和一个描述该属性的方法。我们将存储电池容量并编写一个方法来打印电池的描述:classElectricCar(Car):def__init__(self,make,model,year):"""电动汽车的唯一性初始化属性父类,然后初始化电动汽车特定属性"""super().__init__(make,model,year)self.battery_size=70defdescribe_battery(self):"""打印描述电池容量的消息"""打印(“这辆车有一个”+str(self.battery_size)+“-kWh电池。”)my_tesla=ElectricCar('tesla','models',2016)打印(my_tesla.get_descriptive_name())my_tesla.describe_battery()我们添加了新属性self.battery_size,并设置了它的初始值。从ElectricCar类创建的所有实例都将包含此属性,但所有Car实例都不会。我们还添加了一个名为describe_battery()的方法,用于打印有关电池的信息。当我们调用这个方法时,我们会看到一个电动汽车的具体描述:2016TeslaModelSThiscarhasa70-kWhbattery。ElectricCar类的专业化程度没有限制。模拟电动汽车时,您可以根据需要的精度级别添加任意数量的属性和方法。如果属性或方法对任何汽车都是通用的,而不是电动汽车特有的,则应将其添加到Car类而不是ElectricCar类。这样,使用Car类的人将获得相应的功能,而ElectricCar类仅包含处理电动汽车特定属性和行为的代码。重写父类的方法对于父类的方法,只要不符合子类模拟的对象的行为,就可以重写。为此,在子类中定义一个与要覆盖的超类方法同名的方法。这样Python就不会去考虑这个父类的方法,而只会关注你在子类中定义的相应方法。假设Car类有一个名为fill_gas_tank()的方法,该方法对于纯电动汽车毫无意义,因此您可能想要覆盖它。下面演示了一种覆盖方法:defElectricCar(Car):deffill_gas_tank():"""Electriccarsdon'thaveagastank"""print("Thiscardoesn'tneedagastank!")Now,如果有人对电动汽车调用方法fill_gas_tank(),Python将忽略Car类中的方法fill_gas_tank()并运行上面的代码。在使用继承时,可以让子类保留从父类继承的有用代码,用重写来覆盖不需要的代码。这篇文章没有作业。下一篇我们会讲解函数的高级用法
