阅读《Python编程从入门到实践》Day11

第九章(三)

4、导入类

Python的总体理念是让文件尽可能整洁,为此,Python允许你将类存储在模块中,然后再主程序中导入所需模块。

(1)导入单个类

一个命名的问题:将Car类存储在一个名为car.py的模块中,该模块将覆盖前面使用的文件car.py。从现在开始,使用该模块的程序都必须使用更具体的名字。为了方便理解,应对创建的每个模块都编写文档字符串,即对模块的内容作简要的描述。下面创建一个my_car.py文件,在其中导入Car类并创建实例:

from car import Car
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
# 输出:
2016 Audi A4
This car has 23 miles on it.

第一条语句让Python打开模块car,并导入其中的Car类。导入类是一种有效的编程方式。

(2)在一个模块中存储多个类

虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的类。类Battery和ElectricCar都可帮助模拟汽车,可将它们都加入模块car.py中。
现在,可以新建一个名为my_electric_car.py的文件,导入ElectricCar类,并创建一辆电动汽车:

from car import ElectricCar
my_tesla = ElectriCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
# 输出:
2016 Tesla Model S
This car has a 70-kWh battery.
This Car can go approximately 240 miles on a full charge.
(3)从一个模块中导入多个类

可根据需要在程序文件中导入任意数量的类。从一个模块中导入多个类时,用逗号分隔各个类。导入必要的类后,就可根据需要创建每个类的任意数量的实例。

(4)导入整个模块

还可以使用import car来导入整个模块,再使用句点表示法访问需要的类。由于创建类实例的代码都包含模块名,因此不会与当前文件使用的任何名称发生冲突。导入了整个模块后,可使用语法module_name.class_name来访问需要的类。

(5)导入模块中的所有类

要导入模块中的每个类,语法格式为:

from module_name import *

不推荐使用这种导入方式。因为,如果只要看一下文件开头的import语句,就能清楚地知道程序使用了哪些类将大有裨益;但这种导入方式没有明确地指出你使用了模块中的哪些类。这种导入方式还可能引发名称方面的困惑。如果你不小心导入了一个与程序文件中其他东西同名的类,将引发难以诊断的错误。
需要从一个模块中导入很多类时,最好导入整个模块,并使用module_name.class_name语法来访问类。这样做时,虽然文件开头并没有列出用到的所有类,但你清楚地知道在程序的哪些地方使用了导入的模块;你还避免了导入模块中的每个类可能引发的名称冲突。

(6)在一个模块中导入另一个模块

有时候,需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类。将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块的类。在这种情况下,可在前一个模块中导入必要的类。

(7)自定义工作流程

在组织大型项目的代码方面,Python提供了很多选项。熟悉所有这些选项很重要,这样你才能确定哪种项目组织方式是最佳的,并能理解别人开发的项目。
一开始应让代码结构尽可能简单,先尽可能在一个文件中完成所有的工作,确定一切都能正常运行后,再将类独立移到独立的模块中。如果喜欢模块和文件的交互方式,可在项目开始时就尝试将类存储到模块中。先让代码可行,再让代码有序。

5、Python标准库

Python标准库是一组模块,安装的Python都包含它。要使用标准库中的任何函数和类,只需要在程序的开头包含一条简单的import语句。下面是模块collections中的一个类——OrderedDict。
字典让你能够将信息关联起来,但它不记录你添加键-值对的顺序。要创建字典并记录其中的键-值对的添加顺序,可使用模块collections中的OrderedDict类。OrderedDict实例的行为几乎与字典相同,区别只在于记录了键-值对的添加顺序。

from collections import OrderedDict
favorite_languages = OrderedDict()
favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'
for name, language in favorite_languages.items():
    print(name.title() + "'s favorite language is " +
          language.title() + ".")
# 输出:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Python.

这里创建一个字典不需要用到花括号,而是调用OrderedDict()来创建一个空的有序字典。
这是一个很不错的类,它兼具列表和字典的优点(在将信息关联起来的同时保留原来的顺序)。

6、类编码风格

类名应采用驼峰命名法,即将类名中的每个单词的首字母大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。
对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的功能,并遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述。
可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。
需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,在添加一个空行,然后编写导入你自己编写的模块的import语句。在包含多条import语句的程序中,这种做法让人更容易明白程序使用的各个模块都来自何方。

你可能感兴趣的:(阅读《Python编程从入门到实践》Day11)