1、导入类
Python允许将定义的类存储在模块中,然后在主程序中导入所需的模块。
1.1 导入单个类
在car.py文件中定义了类Car:
car.py
#定义类
class Car():
"""创建车类"""
def __init__(self,maker,model,year):
"""初始化属性"""
self.maker = maker
self.model = model
self.year = year
self.odometer = 0
def show(self):
"""返回信息"""
lname = str(self.year) + ' ' + self.maker + ' ' + self.model
return lname
def update_odometer(self,new_odometer):
"""更新里程"""
if new_odometer >= self.odometer:
self.odometer = new_odometer
else:
print("You can't roll back an odometer!")
def increase_odometer(self,miles):
self.odometer += miles
接着,在另一个文件中导入类,并创建实例:
car_0.py
from car import Car
car_0 = Car('Tesla','model s',2019)
print(car_0.show())
car_0.odometer = 30
print(car_0.odometer)
#结果:
2019 Tesla model s
30
1.2 在一个模块中存储多个类
可以根据需要在一个模块中存储任意数量的类:
car.py
#定义类
class Car():
"""创建车类"""
def __init__(self,maker,model,year):
"""初始化属性"""
self.maker = maker
self.model = model
self.year = year
self.odometer = 0
def show(self):
"""返回信息"""
lname = str(self.year) + ' ' + self.maker + ' ' + self.model
return lname
def update_odometer(self,new_odometer):
"""更新里程"""
if new_odometer >= self.odometer:
self.odometer = new_odometer
else:
print("You can't roll back an odometer!")
def increase_odometer(self,miles):
self.odometer += miles
class Battery():
"""模拟电瓶"""
def __init__(self,battery_size = 60):
self.battery_size = battery_size
def get_range(self):
if self.battery_size == 70:
range = 240
elif self.battery_size == 60:
range = 200
return range
class Ecar(Car):
"""电车"""
def __init__(self,maker,model,year):
super().__init__(maker,model,year)
self.battery = Battery()
car_0.py
from car import Ecar
car_0 = Ecar('Tesla','model s',2019)
print(car_0.show())
print(car_0.battery.battery_size)
print(car_0.battery.get_range())
#结果:
2019 Tesla model s
60
200
1.3 从一个模块导入多个类
可以根据需要在程序中导入任意数量的类。从一个模块导入多个类时,用逗号分隔各个类:
from car import Car,Ecar
car_0 = Car('Audi','A4',2016)
print(car_0.show())
car_1 = Ecar('Tesla','model s',2019)
print(car_1.show())
#结果:
2016 Audi A4
2019 Tesla model s
1.4 导入整个模块
还可以导入整个模块,使用句点表示法访问需要的类。
import car
car_0 = car.Car('Audi','A4',2016)
print(car_0.show())
car_1 = car.Ecar('Tesla','model s',2019)
print(car_1.show())
1.5 导入模块中所有的类
要导入一个模块中所有的类,可以使用以下语句:
from module_name import *
但不建议这样导入。
首先,这样导入没有明确指出使用了模块中的哪些类,不方便阅读和检查程序。其次,这种导入方式还可能引发命名冲突。
1.6 在一个模块中导入另一个模块
有时需要将类分散到多个模块中,以免模块太大,或在同一模块中存储不相关的类。将类存储在多个模块中时,一个模块中的类可能依赖于另一个模块中的类。这时,可以在前一个模块中导入必要的类。
例如,改写前述代码,将Car类单独存储在一个模块,将Ecar类和Battery类存储在另一个模块ecar.py:
from car import Car
class Battery():
"""模拟电瓶"""
def __init__(self,battery_size = 60):
self.battery_size = battery_size
def get_range(self):
if self.battery_size == 70:
range = 240
elif self.battery_size == 60:
range = 200
return range
class Ecar(Car):
"""电车"""
def __init__(self,maker,model,year):
super().__init__(maker,model,year)
self.battery = Battery()
from car import Car
from ecar import Ecar
car_0 = Car('Audi','A4',2016)
print(car_0.show())
car_1 = Ecar('Tesla','model s',2019)
print(car_1.show())
#结果:
2016 Audi A4
2019 Tesla model s
2、Python标准库
Python标准库是一组模块,安装的Python都包含它。可以使用标准库中的任何函数和类,只需在程序开头使用import语句。
下面以模块collections中的一个类——OrderedDict为例。字典可以将键和值关联,但不记录添加键值对的顺序。使用OrderedDict类的实例,该实例于字典几乎相同,区别只在于记录了键值对的添加顺序。
from collections import OrderedDict
table = OrderedDict()
table['Jack'] = 19
table['Rose'] = 22
table['Bob'] = 23
table['Lily'] = 25
for name,age in table.items():
print(name + ': ' + str(age))
#结果:
Jack: 19
Rose: 22
Bob: 23
Lily: 25
这种类兼具列表和字典的主要优点。
像了解Python标准库,一个资源网站是Python Module of the Week(http://pymotw.com/)
3、类编码风格
类名采用驼峰命名法,及将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名采用小写格式,并在单词之间加上下划线。
对于每个类,都应在类定义之后包含一个文档字符串,简要描述类的功能,且遵循文档字符串的格式。每个模块也应包含一个文档字符串,对其中的类可用于做什么进行描述。
在类中,使用空行来分隔方法;在模块中,使用两个空行分隔类。
需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再加一个空行,然后导入自己编写的模块。这样容易自己和别人阅读代码。