1. 属性添加默认值
可以在 init 方法中对某个属性设定初始值,那么这种情况下,可以不用对形参进行传参。
以之前的 Car 类为例。
class Car():
'''一次模拟汽车的简单尝试'''
def __init__(self,make,model,year):
self.make=make
self.model=model
self.year=year
self.odometer_reading=0
#设定初始的里程数 odometer_reading 为0
def get_descriptive_name(self):
long_name=str(self.year)+' '+self.make+' '+self.model
return long_name.title()
my_car=Car('audi','a4', 2020)
my_car.odometer_reading
2. 修改默认属性的值
(1) 直接修改属性的值
以上述的 my_car 实例为例
my_car.odometer_reading=50
my_car.odometer_reading
(2) 通过方法修改属性的值
class Car():
'''一次模拟汽车的简单尝试'''
def __init__(self,make,model,year):
self.make=make
self.model=model
self.year=year
self.odometer_reading=50
#设定初始的里程数 odometer_reading 为0
def get_descriptive_name(self):
long_name=str(self.year)+' '+self.make+' '+self.model
return long_name.title()
def current_odometer(self,meter):
'''将里程表数目设定为指定值,并且禁止将读数往回调'''
if meter>self.odometer_reading:
self.odometer_reading=meter
else:
print('无法将里程数往回调')
my_car=Car('audi','a4', 2020)
my_car.odometer_reading
#50
my_car.current_odometer(100)
my_car.odometer_reading
#100
my_car.current_odometer(90)
#无法将里程数往回调
3. 继承
编写类的时候,不一定要从空白开始,可以从另一个类继承,这个类就自动获得了另一个类所有的属性和方法,原有的类叫做父类,新的类叫做子类。
3.1 给子类定义属性和方法
'''
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
print(long_name)
def current_odometer(self,meter):
if odometer_reading < meter:
self.odometer_reading=meter
print('current odometer is ' + str(self.odometer_reading))
def gasoline_left(self,volume):
print('there is'+' ' +str(volume)+'L '+'gasoline left.')
'''
#以上述Car类的基础上,增加elecrriccar的子类
class ElectricCar(Car):
'''描述电动汽车的特征'''
def __init__(self,make,model,year):
#初始化父类的属性
super().__init__(make,model,year)
#定义ElectricCar类特有的属性,而Car中不存在
self.battery_size = 70
def describe_battery(self):
#定义ElectricCar类中特有的方法,而Car中不存在
print('this car has a '+str(self.battery_size)+' kWh battery')
ele=ElectricCar('tesla','model s',2020)
ele.describe_battery()
ele.get_descriptive_name()
父类 Car 必须要写在子类前面,或者通过模块的方式导入 Car 类。
ElectricCar 类中包含了 Car 类所有的属性和方法,通过super()函数进行初始化,将子类和父类相关联,调用父类的 init 方法。
同时ElectricCar中可以包含 Car 类不存在的属性,定义 battery_size 这个子类特有的属性,而在父类中不存在。
3.2 重写父类的方法
当然如果不想要父类中的某个方法,也可以对父类的方法进行改写,重新定义与父类中相同的方法名即可覆盖父类方法。
class ElectricCar(Car):
'''描述电动汽车的特征'''
def __init__(self,make,model,year):
#初始化父类的属性
super().__init__(make,model,year)
#定义ElectricCar类特有的属性,而Car中不存在
self.battery_size = 70
def describe_battery(self):
#定义ElectricCar类中特有的方法,而Car中不存在
print('this car has a '+str(self.battery_size)+' kWh battery')
def gasoline_left(self):
#对该方法进行重新改写
print('This car doesn't need a tank !')
ele=ElectricCar('tesla','model s',2020)
ele.gasoline_left()
#This car doesn't need a tank !
3.3 将实例作为属性
随着对类的描述越来详细,整个文件会越来越长,因此需要将类的一部分单独抽出来作为一个独立的小类。
class Battery():
#将电池的描述单独抽出来组成一个类
def __init__(self,battery_size=70):
self.batter_size=battery_size
def describe_battery(self):
print('This Car has a '+str(self.battery_size)+'-kWh battery')
class ElectricCar(Car):
'''描述电动汽车的特征'''
def __init__(self,make,model,year):
#初始化父类的属性
super().__init__(make,model,year)
#将Battery类作为ElectricCar的属性
self.battery_size =Battery()
def describe_battery(self):
#定义ElectricCar类中特有的方法,而Car中不存在
print('this car has a '+str(self.battery_size)+' kWh battery')
def gasoline_left(self):
#对该方法进行重新改写
print('This car doesn't need a tank !')
ele=ElectricCar('tesla','model s',2020)
ele.battery_size.describe_battery()
当调用battery_size时,Python 会去查找 Battery 实例,找到其中的describe_battery()方法。