9 类
用class创建一个类
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self, make: str, model: str, year: int):
self.make = make
self.model = model
self.year = year
return
def get_descriptive_name(self): # 定义一个函数,输出汽车的相关信息
"""返回整洁的描述信息"""
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
my_car = Car('Auto', 'A6L', '2019')
print(my_car.get_descriptive_name())
9.1 创建类和使用类
9.1.1 创建类
方法-_ init _( )
- 类中的函数称为方法—init—( )是一个特殊的方法,每当根据类创建新实例时,都会自动运行它,类似于c++和Java中的构造函数。
- 在类的方法中,参数列表会含有一个self,每个与类相关联的方法调用都会自动传递参数,它是一个指向实例本身的引用,让实例能够直接访问类中的属性和方法。当通过实参向类传递名字和年龄,self会自动传递,因此我们不需要传递它,类似于其他高级语言中的this。
- 以self为前缀变量都可以供类中的所有方法使用,还可以通过类的任何实例来访问这些变量。如self.make=name会获取存储在形参make 中的值。
9.1.2 调用方法
在创建类的实例后,就可以通过使用句点表示法来调用类定义的任何方法。
9.2 使用类和实例
9.2.1 给属性指定默认的值
类中的每一个属性都必须有初始值,哪怕这个值是0或空字符串,如果你对方法中某个属性这么多了,那么在调用时,就不需要为它提供初始值的形参。
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self, make: str, model: str, year: int):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #odometer变量的初始值为0
return
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.")
return
9.2.2 通过方法来修改属性的值
def increment_odometer(self, miles):
"""将里程表读数增加指定的量"""
self.odometer_reading += miles
return
9.3 继承
一个类继承另一个类时,它将自动获取另一个类的所有属性和方法,原有的类称为父类,而新的类称为子类,子类除了继承父类的所有属性和方法,还可以定义自己的属性和方法
9.3.1 子类的方法__init__( )
创建子类时,Python首先需要完成的任务是给父类的所有属性赋值,为此,子类的方法__init__( )需要父类施以援手
class ElectricCar(Car):
"""模拟电动汽车的独特之处"""
def __init__(self, make: str, model: str, year: int):
"""初始化父类的属性,再初始化电动汽车特有的属性"""
super.__init__(make, model, year)
return
- 创建子类时,父类必须包含在当前文件中,且位于子类的前面
- super( )是一个特殊的函数,帮助Python将父类和子类联系起来,它可以自动调用父类的方法__init__( )
9.3.2 重写父类的方法
对于父类的方法,只要不符合子类模拟的方法,都可以对其进行重写。为此,只要在子类中定义一个方法,它与要重写的父类方法同名。
def fill_gas_tank(self):
"""电动汽车没有油"""
print("This car doesn't need a gas tank!")
return
9.4 导入类
from Car.car import Car, ElectricCar
my_car = Car('Auto', 'A6L', 2019)
print(my_car.get_descriptive_name())
#Car.py
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self, make: str, model: str, year: int):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
self.gas=100
return
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.")
return
def update_odometer(self, mileage):
"""将里程表设置为指定的值,并且拒绝往回调"""
if mileage > self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer.")
return
def fill_gas_tank(self):
"""打印一条消息,指出汽车的油量"""
print("This car has "+str(self.gas)+" litre of oil")
return
def increment_odometer(self, miles):
"""将里程表读数增加指定的量"""
self.odometer_reading += miles
return
def __str__(self):
return self.get_descriptive_name()
class Battery:
"""一次模拟电池的简单尝试"""
def __init__(self, battery_size=70):
"""初始化电瓶容量"""
self.battery_size = battery_size
return
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-Kwh battery")
return
def get_range(self):
"""打印一条描述电瓶续航里程的消息"""
if self.battery_size == 70:
range = 240
elif self.battery_size == 85:
range = 270
message = "This car an go approximately " + str(range)
message += " miles on a full charge."
print(message)
return
class ElectricCar(Car):
"""模拟电动汽车的独特之处"""
def __init__(self, make: str, model: str, year: int):
"""初始化父类的属性,再初始化电动汽车特有的属性"""
super.__init__(make, model, year)
self.battery = Battery()
return
def fill_gas_tank(self):
"""电动汽车没有油"""
print("This car doesn't need a gas tank!")
return