《Python编程的术与道:Python语言入门》视频课程
《Python编程的术与道:Python语言入门》视频课程链接:https://edu.csdn.net/course/detail/27845
模块和类 (Modules and classes)
Python允许将类保存在另一个文件中,然后将它们导入到你正在处理的程序中。 这样做的另一个好处是可以将类隔离到文件中,从而可以在任意数量的不同程序中使用。
将一个类保存在模块中
将类保存到单独的文件中时,该文件称为模块(module)。 一个模块中可以有任意数量的类。
首先将Vehicle类保存到名为vehicle.py的文件中。 请注意这里使用的命名约定:模块以小写名称保存,类以大写字母开头。
# Save as vehicle.py
# base class
class Vehicle():
def __init__(self, color):
self.color = color
def description(self):
print("I'm a", self.color, "Vehicle")
创建一个名为vehicle_game.py的单独文件。 同样,要使用标准命名约定,确保为此文件使用lowercase_underscore名称。
# Save as vehicle_game.py
from vehicle import Vehicle
vehicle = Vehicle('White')
vehicle.description()
I'm a White Vehicle
这非常干净整洁。你不必在处理vehicle.py文件中的类代码; 定义车辆属性和行为的代码存在于一个文件中,可以在任何地方使用。
第一行告诉Python查找名为vehicle.py的文件。 它在与当前程序相同的目录中查找该文件。 你可以将你的类放在其他目录中,但稍后介绍如何做。
当Python找到文件vehicle.py时,它会查找一个名为Vehicle的类。 当它找到该类时,它会将该代码导入当前文件。 然后,你可以自由地使用Vehicle类。
将多个类保存在一个模块中
一个模块只是一个包含一个或多个类或函数的文件,因此car类实际上也属于vehicle模块:
# Save as vehicle.py
# base class
class Vehicle():
def __init__(self, color):
self.color = color
def description(self):
print("I'm a", self.color, "Vehicle")
# subclass
class Car(Vehicle):
def __init__(self, color, style):
super().__init__(color) # invoke Vehicle’s __init__() method
self.style = style
def description(self):
print("I'm a", self.color, self.style)
现在可以导入vehicle和car类,并使用它们:
# Save as car_game.py
from vehicle import Vehicle, Car
# create an object from each class
v = Vehicle('Red')
c = Car('Black', 'SUV')
v.description()
c.description()
I'm a Red Vehicle
I'm a Black SUV
第一行告诉Python从vehicle模块导入Vehicle和Car类。当然, 你不必导入模块中的每个类; 可以选择使用的类,这样Python只花时间处理这些特定的类。
导入模块和类的若干方法
有几种方法可以导入模块和类,每种方法都有自己的优点。
import module_name
from module_name import ClassName
这种方法很简单,很常用。 它允许直接在程序中使用类名,因此是非常干净且可读的代码。 但是,如果要导入的类的名称与你正在使用的程序中已使用的名称冲突,则可能会出现问题。
在这种情况下,你可以导入模块本身:
# Save as car_game.py
import vehicle
# create an object from each class
v = Vehicle('Red')
c = Car('Black', 'SUV')
v.description()
c.description()
I'm a Red Vehicle
I'm a Black SUV
这种导入的一般语法是:
import module_name
在此之后,使用点表示法访问类:
module_name.ClassName
import module_name as local_module_name
import module_name as local_module_name
将模块导入其中一个项目时,可以自由选择项目中模块所需的任何名称。
# Save as car_game.py
import vehicle as vehicle_module
# create an object from each class
v = Vehicle('Red')
c = Car('Black', 'SUV')
v.description()
c.description()
I'm a Red Vehicle
I'm a Black SUV
此方法通常用于缩短模块的名称,因此不必在要使用的每个类名之前键入长模块名称。
import vehicle as vehicle_module
代码比以下更易读:
import vehicle as veh
from module_name import *
还有一个应该注意的导入语法,但应该避免使用。 此语法导入模块中的所有可用类和函数:
from module_name import *
不建议这样做。 首先,你可能不知道模块中所有类和函数的名称是什么。 如果不小心将其中一个变量与模块中的名称相同,则会出现命名冲突。 此外,可能将更多代码导入到程序中,而不是你所需要的。
函数模块
可以使用模块存储在不同程序中使用的一组函数,即使这些函数未附加到任何一个类。 为此,将函数保存到一个文件中,然后导入该文件,就像在上一节中看到的那样。 这是一个非常简单的例子; 保存到文件multiplying.py:
# Save as multiplying.py
def double(x):
return 2*x
def triple(x):
return 3*x
def quadruple(x):
return 4*x
现在可以导入文件multiplying.py,并使用这些函数。 使用from module_name import function_name
语法:
from multiplying import double, triple, quadruple
print(double(5))
print(triple(5))
print(quadruple(5))
10
15
20
使用 import module_name
语法:
import multiplying
print(multiplying.double(5))
print(multiplying.triple(5))
print(multiplying.quadruple(5))
10
15
20
使用 import module_name as local_module_name
语法:
import multiplying as m
print(m.double(5))
print(m.triple(5))
print(m.quadruple(5))
10
15
20
使用 from module_name import *
语法:
from multiplying import *
print(double(5))
print(triple(5))
print(quadruple(5))
10
15
20