模块与包
- 模块
- 模块使用
- 包
- 包的使用
- 使用第三方的包
模块
随着我们对Python学习的深入,我们的代码量也会渐渐增多。有时我们为了让书写的代码结构更清晰,我们会将一些代码整理到不同的.py文件中,并跨文件的使用它们。这些可以被其他文件调用的文件,我们就称其为模块。
模块的创建很简单,创建一个.py文件,文件里面可以是变量、函数、类。例如,我们可以将我们在类中学习的代码封装成一个animal模块。
我们先创建一个animal.py文件,在文件中写入我们上次所写的几个类与一个hello函数。
"""Animal.py"""
class Animal():
def __init__(self, name):
self.name = name
def greet(self):
print(f'Hello, I am {self.name}.')
class Dog(Animal):
def greet(self):
print(f'WangWang.., I am {self.name}.')
class Cat(Animal):
def greet(self):
print(f'MiaoMiao.., I am {self.name}')
def hello(animal):
animal.greet()
这样, 我们就创建了一个属于Animal模块。
模块使用
创建好模块后,我们要怎么在其他的.py文件中使用它呢?使用方法如下:
在新的.py文件中,这里是新建了一个main.py文件。使用import importname
将所需要的模块调入。若要使用其中的类或函数,则采用importname.classname
或importname.functionname
的方式调用。
"""main.py"""
import animal
#使用animal模块中的类
dog = animal.Dog('dog')
animal.hello(dog) #WangWang.., I am dog.
cat = animal.Cat('cat')
animal.hello(cat) #MiaoMiao.., I am cat
有时候,为书写方便,或为避免同名产生歧义。我们可以在引入包的时候给我们引入的包一个别名。
"""main.py"""
#给引入的animal包一个别名ani
import animal as ani
#用别名调用模块中的类
dog = ani.Dog('dog')
ani.hello(dog) #WangWang.., I am dog.
cat = ani.Cat('cat')
ani.hello(cat) #MiaoMiao.., I am cat
有时我们需要的只是模块中的某个类或函数。此时,我们也可单独导入所需的类或函数,而无需导入整个模块。
"""main.py"""
#只引入所需要的函数或类
from animal import Dog,Cat,hello
#使用animal模块中的类
dog = Dog('dog')
hello(dog) #WangWang.., I am dog.
cat = Cat('cat')
hello(cat) #MiaoMiao.., I am cat
对应的,你也能给引入的类或函数一个别名。
"""main.py"""
#为导入的方法或类取个别名
from animal import Dog as D,Cat as C,hello
#使用animal模块中的类
dog = D('dog')
hello(dog) #WangWang.., I am dog.
cat = C('cat')
hello(cat) #MiaoMiao.., I am cat
最后,还有一种最省力的方法,直接导入包中所有的类与函数。直接from importname import *
。
但不推荐这样使用,因为这样会导致代码的可读性很差,而且还可能会覆盖一些你已经定义过的东西。
"""main.py"""
from animal import *
#使用animal模块中的类
dog = Dog('dog')
hello(dog) #WangWang.., I am dog.
cat = Cat('cat')
hello(cat) #MiaoMiao.., I am cat
包
包的使用
包是一种通过用“带点号的模块名”来构造 Python 模块命名空间的方法。 例如,模块名 A.B 表示 A 包中名为 B 的子模块。
假设你想为声音文件和声音数据的统一处理,设计一个模块集合(一个“包”)。由于存在很多不同的声音文件格式(通常由它们的扩展名来识别,例如:.wav, .aiff, .au),因此为了不同文件格式间的转换,你可能需要创建和维护一个不断增长的模块集合。 你可能还想对声音数据还做很多不同的处理(例如,混声,添加回声,使用均衡器功能,创造人工立体声效果), 因此为了实现这些处理,你将另外写一个无穷尽的模块流。这是你的包的可能结构(以分层文件系统的形式表示):
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
当导入这个包时,Python搜索 sys.path 里的目录,查找包的子目录。
包的用户可以从包中导入单个模块,例如:
import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
导入子模块的另一种方法是:
from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
另一种形式是直接导入所需的函数或变量:
from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)
使用第三方的包
pyhon中有很多不错的第三方的包,例如numpy、Pillow等等,在此不展开介绍。这里就简单的介绍一下这些包的获取方法。
在python终端中输入:
pip install packagename
packagename根据你所要下载的包进行替换,然后点击回车运行。
例如,我们想要下载一个pillow包,则可输入
pip install pillow
不过,由于墙的存在,直接下载会比较慢甚至下载失败。因此,我们也可以转到国内镜像进行下载。
pip install pillow -i https://pypi.douban.com/simple --trusted-host pypi.douban.com
下载后的结果如图所示:
然后我们就可以使用PIL的模块,对图片进行一些操作:
from PIL import Image, ImageFilter
# Open an image
im = Image.open('test.jpg')
im.show()
# Use contour filter
im2 = im.filter(ImageFilter.CONTOUR)
im2.show()
im2.save('new.jpg', 'jpeg')
国内镜像
http://pypi.douban.com/simple/ 豆瓣
http://mirrors.aliyun.com/pypi/simple/ 阿里
http://pypi.hustunique.com/simple/ 华中理工大学
http://pypi.sdutlinux.org/simple/ 山东理工大学
http://pypi.mirrors.ustc.edu.cn/simple/ 中国科学技术大学
https://pypi.tuna.tsinghua.edu.cn/simple 清华