Python允许你将类存 储在模块中,然后在主程序中导入所需的模块。
9.4.1 导入单个类
car.py
#!/usr/bin/env python #coding:utf-8 """一组用于表示燃油汽车和电动汽车的类""" 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 return long_name.title() def read_odometer(self): """打印一条消息,指出汽车的里程""" print("This car has " + str(self.odometer_reading) + " miles on it.") def update_odometer(self, mileage): """ 将里程表读数设置为指定的值 拒绝将里程表往回拨 """ if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print("You can't roll back an odometer!") def increment_odometer(self, miles): """将里程表读数增加指定的量""" self.odometer_reading += miles
my_car
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 5 #打开模块car ,并导入其中的Car 类 6 from car import Car 7 8 my_new_car = Car('audi', 'a4', 2016) 9 print(my_new_car.get_descriptive_name()) 10 my_new_car.odometer_reading = 23 11 my_new_car.read_odometer()
9.4.2 在一个模块中存储多个类
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 """一组用于表示燃油汽车和电动汽车的类""" 5 class Car(): 6 def __init__(self, make, model, year): 7 """初始化描述汽车的属性""" 8 self.make = make 9 self.model = model 10 self.year = year 11 self.odometer_reading = 0 12 def get_descriptive_name(self): 13 """返回整洁的描述性名称""" 14 long_name = str(self.year) + ' ' + self.make + ' ' + self.model 15 return long_name.title() 16 def read_odometer(self): 17 """打印一条消息,指出汽车的里程""" 18 print("This car has " + str(self.odometer_reading) + " miles on it.") 19 def update_odometer(self, mileage): 20 """ 将里程表读数设置为指定的值 21 拒绝将里程表往回拨 22 """ 23 if mileage >= self.odometer_reading: 24 self.odometer_reading = mileage 25 else: 26 print("You can't roll back an odometer!") 27 def increment_odometer(self, miles): 28 """将里程表读数增加指定的量""" 29 self.odometer_reading += miles 30 31 class Battery(): 32 """一次模拟电动汽车电瓶的简单尝试""" 33 def __init__(self, battery_size=60): 34 """初始化电瓶的属性""" 35 self.battery_size = battery_size 36 def describe_battery(self): 37 """打印一条描述电瓶容量的消息""" 38 print("This car has a " + str(self.battery_size) + "-kWh battery.") 39 def get_range(self): 40 """打印一条描述电瓶续航里程的消息""" 41 if self.battery_size == 70: 42 range = 240 43 elif self.battery_size == 85: 44 range = 270 45 message = "This car can go approximately " + str(range) 46 message += " miles on a full charge." 47 print(message) 48 class ElectricCar(Car): 49 """模拟电动汽车的独特之处""" 50 def __init__(self, make, model, year): 51 """ 初始化父类的属性,再初始化电动汽车特有的属性""" 52 53 super().__init__(make, model, year) 54 self.battery = Battery()
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 from car import ElectricCar 5 6 my_tesla = ElectricCar('tesla', 'model s', 2016) 7 print(my_tesla.get_descriptive_name()) 8 my_tesla.battery.describe_battery() 9 my_tesla.battery.get_range()
9.4.3 从一个模块中导入多个类
my_cars.py
1 from car import Car, ElectricCar 2 my_beetle = Car('volkswagen', 'beetle', 2016) 3 print(my_beetle.get_descriptive_name()) 4 my_tesla = ElectricCar('tesla', 'roadster', 2016) 5 print(my_tesla.get_descriptive_name())
1 2016 Volkswagen Beetl 2 2016 Tesla Roadster
9.4.4 导入整个模块
可以导入整个模块,再使用句点表示法访问需要的类。这种导入方法很简单,代码也易于阅读。由于创建类实例的代码都包含模块名,因此不会与当前文件使用的任何名称 发生冲突。
my_cars.py
1 import car 2 my_beetle = car.Car('volkswagen', 'beetle', 2016) 3 print(my_beetle.get_descriptive_name()) 4 my_tesla = car.ElectricCar('tesla', 'roadster', 2016) 5 print(my_tesla.get_descriptive_name())
9.4.5 导入模块中的所有类
from module_name import *
9.4.6 在一个模块中导入另一个模块
9.5 Python标准库
Python标准库 是一组模块,安装的Python都包含它。你现在对类的工作原理已有大致的了解,可以开始使用其他程序员编写好的模块了。可使用标准库中的任何函数和类,为此 只需在程序开头包含一条简单的import 语句。下面来看模块collections 中的一个类——OrderedDict 。 字典让你能够将信息关联起来,但它们不记录你添加键—值对的顺序。要创建字典并记录其中的键—值对的添加顺序,可使用模块collections 中的OrderedDict 类。OrderedDict 实例的行为几乎与字典相同,区别只在于记录了键—值对的添加顺序。
9.6 类编码风格 你必须熟悉有些与类相关的编码风格问题,在你编写的程序较复杂时尤其如此。 类名应采用驼峰命名法 ,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。 对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的功能,并遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文 档字符串,对其中的类可用于做什么进行描述。 可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。 需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import 语句,再添加一个空行,然后编写导入你自己编写的模块的import 语句。在包含多 条import 语句的程序中,这种做法让人更容易明白程序使用的各个模块都来自何方。