写点什么

Python 语法之模块和包(2)

作者:向阳逐梦
  • 2022 年 9 月 28 日
    四川
  • 本文字数:2764 字

    阅读完需:约 9 分钟

1.from <module_name> import <name(s)>

下面,我们一起来看模块导入的另一种方法,直接导入模块中的对象,语句为:from 模块名 import 方法名,我们一起看下方实例:

from utils import max_num, min_num
print(max_num(4, 5))print(min_num(4, 5))
复制代码

使用这种方式导入时,调用 max_nummin_num 函数便不需要添加前缀 utils.

有时候,为了方便,会使用 from <module_name> import * 来导入模块中的所有对象。

from utils import *
print(max_num(4, 5))print(min_num(4, 5))
复制代码

2.from <module_name> import  as <alt_name>

Python 中模块内的对象和方法也可以有自己的别名,实现语句为: from 模块名 import *** as 别名 ,该命令为导入的对象起一个别名。这样就可以通过别名来使用对象。例如:

from utils import max_num as max_n, min_num as min_n
print(max_n(4, 5))print(min_n(4, 5))
复制代码

在上面的例子中,分别为 max_num,min_num 取了别名 max_n,min_n。这样在调用函数时,便可以使用 max_n,min_n

3.import <module_name> as <alt_name>

我们还可以为导入的整个模块起一个别名,这样便可以通过模块的别名来使用模块,使用方法是一样的,都是将 模块名. 作为前缀。例如:

import utils as ul
print(ul.max_num(4, 5))print(ul.min_num(4, 5))
复制代码

在上面的例子中,为模块 utils 取了别名 ul,这样在调用函数时,便可以使用 ul. 前缀。

4.包含单个类的模块

一起来看下包含单个类的模块,我们创建一个模块(car.py),包含类 car ,语句如下:

class Car:    def __init__(self, mk, md, y, c):        self.make = mk        self.model = md        self.year = y        self.color = c        self.mileage = 0
def get_description(self): description = f'{self.year} {self.color} {self.make} {self.model}' print(description)
def get_mileage(self): print(f"This car has {self.mileage} miles on it")
def update_mileage(self, mile): self.mileage = mile
复制代码

导入类(my_car.py):

from car import Car
my_car = Car('audi', 'a4', 2016, 'white')my_car.get_description()my_car.update_mileage(30)my_car.get_mileage()
复制代码

5.包含多个类的模块

我们创建模块(car.py),其中包含父类 car 和继承类 Electriccar ,语句如下:

class Car:    def __init__(self, mk, md, y, c):        self.make = mk        self.model = md        self.year = y        self.color = c        self.mileage = 0
def get_description(self): description = f'{self.year} {self.color} {self.make} {self.model}' print(description)
def get_mileage(self): print(f"This car has {self.mileage} miles on it")
def update_mileage(self, mile): self.mileage = mile

class ElectricCar(Car): def __init__(self, mk, md, y, c): super().__init__(mk, md, y, c) self.battery_size = 100
def get_battery(self): print(f"This car has {self.battery_size} -kWh battery.")
复制代码

导入单个类(my_electirc_car.py):

from car import ElectricCar
my_tesla = ElectricCar('tesla', 'model 3', 2018, 'white')my_tesla.get_description()my_tesla.get_battery()
复制代码

导入多个类(my_cars.py):

from car import ElectricCar, Car
my_car = Car('audi', 'a4', 2016, 'white')my_car.update_mileage(30)my_car.get_mileage()
my_tesla = ElectricCar('tesla', 'model 3', 2018, 'white')my_tesla.get_description()my_tesla.get_battery()
复制代码

导入整个模块:

import car
my_car = car.Car('audi', 'a4', 2016, 'white')my_car.update_mileage(30)my_car.get_mileage()
my_tesla = car.ElectricCar('tesla', 'model 3', 2018, 'white')my_tesla.get_description()my_tesla.get_battery()
复制代码

导入模块中的全部类:

from car import *
my_car = Car('audi', 'a4', 2016, 'white')my_car.update_mileage(30)my_car.get_mileage()
my_tesla = ElectricCar('tesla', 'model 3', 2018, 'white')my_tesla.get_description()my_tesla.get_battery()
复制代码

6.包

在程序中呢,也会遇到和仓颉一样的问题,就是假设我们开发了一个很庞大的应用程序,程序包含了非常多的模块。随着模块数量的增长,如果将模块都放在同一个目录下,将变得越来越难管理。特别当模块具有相似的名称或相似的功能。这时候我们非常希望对这些模块进行分组管理,Python 中的包实现了对模块分组管理的功能。包的创建非常简单,它利用了操作系统的分层文件结构。我们只要将模块放在一个目录下便可。

在上图中,目录 pkg 下有两个模块,utils1.pyutils2.py,pkg 便是一个包。(包相当于一个文件夹,模块则相当于文件夹中的文件)

两个模块中的语句如下:(语句相当于文件中的内容)

utils1.py:

def max_num(a, b):    if a >= b:        return a    else:        return b

def min_num(a, b): if a > b: return b else: return a
复制代码

utils2.py:

def sum_num(a, b):    return a + b

def abs_num(a): if a >= 0: return a else: return -a
复制代码

6.1import <module_name>[, <module_name> ...]

导入包中的模块,语法规则为:import 包.模块名,我们一起看下方语句:

import pkg.utils1import pkg.utils2
print(pkg.utils1.max_num(4, 5))print(pkg.utils2.sum_num(4, 5))
复制代码

导入包 pkg 中的模块 utils1 和模块 utils2,并调用两个模块中的方法,将 pkg.utils1. 作为前缀放在 max_num()方法前,表示是在 pkg 包中的模块 utils1 内的方法。

6.2from <package_name> import <modules_name>[, <module_name> ...]

我们也可以通过 from 语句来实现模块的导入,我们一起看下方语句:

from pkg import utils1, utils2
print(utils1.max_num(4, 5))print(utils2.sum_num(4, 5))
复制代码

6.3from <module_name> import <name(s)>

我们再来一起看下,定义包之后,导入指定模块中的对象,我们看下方语句:

from pkg.utils1 import max_num
print(max_num(4, 5))
复制代码

和第二部分模块导入相比,就是在模块名前将包的名字作为前缀 pkg.utils1 来实现的,其余语句均与模块导入一致。

6.4from <module_name> import  as <alt_name>

为模块内的对象和方法设置别名,语句如下:

from pkg.utils1 import max_num as max_n
print(max_n(4, 5))
复制代码

6.5from <package_name> import <module_name> as <alt_name>

为导入的整个模块设置别名,语句如下:

from pkg import utils1 as ul1
print(ul1.max_num(4, 5))
复制代码

7.小试牛刀

自定义一个模块,并在另一个文件中导入这个模块。

发布于: 刚刚阅读数: 6
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022.06.01 加入

InfoQ签约作者、阿里云“乘风者计划”签约博主

评论

发布
暂无评论
Python语法之模块和包(2)_9月月更_向阳逐梦_InfoQ写作社区