目录
8.5、导入类
随着你不断地给类添加功能,文件可能变得很长,即便你妥善地使用了继承亦如此。为遵循Python的总体理念,应让文件尽可能整洁。为在这方面提供帮助,Python允许你将类存储在模块中,然后在主程序中导入所需的模块。
8.5.1、导入单个类
例如前面汽车的案例,首先创建一个car.py文件,里面只包含Car类的代码。
"""
一个用于表示汽车的类
"""
class Car():
"""模拟汽车 -> make :制作 ;model:模型;year:年份"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make = make # 制作
self.model = model # 模型
self.year = year # 年份
self.odometer = 0
def get_read_odometer(self):
"""获取汽车的里程信息"""
print("此款"+self.make+self.model+
'型车已行驶'+str(self.odometer) + '公里')
def update_orometer(self,mileage):
"""
将里程表读数设置为指定的值
禁止将里程表数让回调
"""
if mileage >= self.odometer:
self.odometer = mileage
else:
print("您的操作无效")
def increment_odometer(self,miles):
"""将里程表读数增加指定的量"""
self.odometer += miles
def get_car_information(self):
"""返回一些描述汽车的信息"""
mesg_name = '生产于:'+str(self.year)+'年 --> 类型:'+self.make+' --> 型号:'+self.model
return mesg_name
def fill_gas_tank(self):
"""模拟父类中fill_gas_tank()方法"""
print("父类--->这个汽车没有油箱!")
def print_info(self):
"""打印汽车信息方法"""
return print(self.get_car_information())
下面来创建另一个文件----->my_car.py,其中导入Car类并创建实例。
from car import Car
my_new_car = Car('奔驰','G500',2020)
print(my_new_car.get_car_information())
my_new_car.odometer = 34
my_new_car.get_read_odometer()
import语句让Python打开模块car,并导入其中的Car类。这样我们就可以使用Car类了。
运行结果:
生产于:2020年 --> 类型:奔驰 --> 型号:G500
此款奔驰G500型车已行驶34公里
8.5.2、在一个模块中存储多个类
虽然同一个模块中的类之间应存在某个相关性,但可根据需要在一个模块中存储任意数量的类。
下面将类Battery和ElectricCar都可帮助模拟汽车,因此下面将它们都加入模块car.py中:
from car import ElectricCar
my_moto = ElectricCar('小刀','A6',2019)
print(my_moto.get_car_information())
my_moto.battery.battery_value = 85
my_moto.battery.describe_battery()
my_moto.battery.get_range()
运行结果:
生产于:2019年 --> 类型:小刀 --> 型号:A6
这个电瓶电量:85-kWh
此电瓶续航 360 -公里
8.5.3、导入模块中的所有类
要导入模块中的每个类,可食用下面的语法:
from module_name import *
不推荐使用这种导入方式,其原因有二。首先,如果只要看一下文件开头的import语句,就能清楚地知道程序使用了哪些类,将大有裨益;但这种导入方式没有明确地指出你使用了模块中的哪些类。这种导入方式还可能引发名称方面的困惑。如果你不小心导入了一个与程序文件中其他东西同名的类,将引发难以诊断的错误。这里之所以介绍这种导入方式,是因为虽然不推荐使用这种方式,但你可能会在别人编写的代码中见到它。
需要从一个模块中导入很多类时,最好导入整个模块,并使用module_name.class_name语法来访问类。这样做时,虽然文件开头并没有列出用到的所有类,但你清楚地知道在程序的哪些地方使用了导入的模块;你还避免了导入模块中的每个类可能引发的名称冲突。
8.5.4、在一个模块中导入另一个模块
有时候,需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类。将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。
from car import Car
class Battery():
--略--
class ElectricCar(Car):
--略--