编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
创建子类的实例时,Python 首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init__()需要父类施以援手。创建子类时,父类必须包含在当前文件中,且位于子类前面。例如:我们定义了子类 ElectricCar。定义子类时,必须在括号内指定父类的名称。方法__init__()接受创建 Car 实例所需的信息。super() 是一个特殊函数,帮助 Python 将父类和子类关联起来。这行代码让 Python 调用 ElectricCar 的父类的方法__init__(),让 ElectricCar 实例包含父类的所有属性。父类也称为超类(superclass),名称super因此而得名。
# 输入
class Car(object):
def __init__(self,band,model,year):
self.band = band
self.model = model
self.year = year
self.mile = 300
def get_info(self):
print(
"My car is " + self.band.title() + " "
+ self.model + " and bought in " + str(self.year))
def report_odometer(self):
print("The mile drving is " + str(self.mile))
class UsedCar(Car):
def __init__(self,band,model,year):
super().__init__(band,model,year)
usedcar = UsedCar("Audi","A4",2016)
usedcar.report_odometer()
# 输出
The mile drving is 300
给子类定义属性和方法
让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。你可以根据所需的准确程度添加任意数量的属性和方法。如果一个属性或方法是父类都有的,而不是子类特有的,就应将其加入到父类而不是子类中。这样,使用父类的人将获得相应的功能,而子类只包含处理子类特有属性和行为的代码。
# 输入
class Car(object):
def __init__(self,band,model,year):
self.band = band
self.model = model
self.year = year
self.mile = 300
def get_info(self):
print(
"My car is " + self.band.title() + " "
+ self.model + " and bought in " + str(self.year))
def report_odometer(self):
print("The mile drving is " + str(self.mile))
class UsedCar(Car):
def __init__(self,band,model,year):
super().__init__(band,model,year)
def reportformerdriver(self,driver):
self.driver = driver
print("This car former driver is " + self.driver)
usedcar = UsedCar("Audi","A4",2016)
usedcar.reportformerdriver("Youth")
# 输出
This car former driver is Youth
重写父类的方法
对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。
# 输入
class Car(object):
def __init__(self,band,model,year):
self.band = band
self.model = model
self.year = year
self.mile = 0
def get_info(self):
print(
"My car is " + self.band.title() + " "
+ self.model + " and bought in " + str(self.year))
def report_odometer(self):
print("The mile is " + str(self.mile) + ". Because this car is new car")
class UsedCar(Car):
def __init__(self,band,model,year):
super().__init__(band,model,year)
def reportformerdriver(self,driver):
self.driver = driver
print("This car former driver is " + self.driver)
def report_odometer(self):
print("The odometer should not be 0 " )
my_car = Car("BMW","I8",2020)
my_car.report_odometer()
usedcar = UsedCar("Audi","A4",2016)
usedcar.report_odometer(600)
# 输出
The mile is 0. Because this car is new car
The odometer should not be 0
将实例用作属性
使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大型类拆分成多个协同工作的小类。
# 输入
class Car(object):
def __init__(self,band,model,year):
self.band = band
self.model = model
self.year = year
self.mile = 0
class Electriccar(Car):
def __init__(self,band,model,year):
super().__init__(band,model,year)
self.voltage = Voltage()
class Voltage(object):
def __init__(self,voltage = "12"):
self.voltage = voltage
def printvoltage(self,voltage):
self.voltage = voltage
print("The voltage is " + str(self.voltage))
mycar = Electriccar("Audi","A4",2021)
mycar.voltage.printvoltage(24)
# 输出
The voltage is 24
多继承
Python 同样有限的支持多继承形式。多继承的类定义形如下例。需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
具体的范例如下:
# 输入
class Car(object):
def __init__(self,band,model,year):
self.band = band
self.model = model
self.year = year
self.mile = 0
def printcarinfo(self):
messge = "My car band is " + str(self.band)
message += " and model is " + str(self.model)
message += " which was bought in " + str(self.year)
print(message)
class Electriccar(Car):
def __init__(self,band,model,year):
super().__init__(band,model,year)
self.voltage = Voltage()
class Voltage(object):
def __init__(self,voltage = "12"):
self.voltage = voltage
def printvoltage(self,voltage):
self.voltage = voltage
print("The voltage is " + str(self.voltage))
class Mycar(Electriccar,Voltage):
def __init__(self,band,model,year):
Electriccar.__init__(self,band,model,year)
Voltage.__init__(self)
firstcar = Mycar("Audi","A4",2016)
firstcar.printvoltage(24)
# 输出
The voltage is 24