2021-12-12 Python-15

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()方法。

你可能感兴趣的:(2021-12-12 Python-15)