第九章 Python自定义模块及导入方法

简介:

9.1 自定义模块

自定义模块你已经会了,平常写的代码放到一个文件里面就是啦!

例如,写个简单的函数,作为一个模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
# -*- coding: utf-8 -*-
def  func(a, b):
    return  *  b
class  MyClass:
    def  __init__( self , a, b):
         self .a  =  a
         self .b  =  b
    def  method( self ):
         return  self .a  *  self .b
导入模块:
>>>  import  test
>>> test.func( 2 2 )
4
>>> c  =  test.MyClass( 2 2 )
>>> c.method()
4

是不是很简单!是的,没错,就是这样。

需要注意的是,test就是文件名。另外,模块名要能找到,我的是在当前目录下。

有时经常from...import...,这又是啥呢,来看看:

1
2
3
4
5
6
7
8
9
10
>>>  from  test  import  func, MyClass   # 多个函数或类以逗号分隔
>>> test.func( 2 2 )
Traceback (most recent call last):
   File  "<stdin>" , line  1 in  <module>
NameError: name  'test'  is  not  defined
>>> func( 2 2 )
4
>>> c  =  MyClass( 2 2 )
>>> c.method()
4

看到了吧!如果你不想把模块里的函数都导入,就可以这样。一方面避免导入过多用不到的函数增加负载,另一方面引用时可不加模块名。

如果想调用不加模块名,也想导入所有模块,可以这样:

1
2
3
4
5
6
>>>  from  test  import  *
>>> func( 2 2 )
4
>>> c  =  MyClass( 2 2 )
>>> c.method()
4

使用个星号就代表了所有。

提醒:在模块之间引用也是同样的方式。


博客地址:http://lizhenliang.blog.51cto.com

QQ群:323779636(Shell/Python运维开发群


9.2 作为脚本来运行程序

所有的模块都有一个内置属性__name__,如果import一个模块,那么模块的__name__属性返回值一般是文件名。如果直接运行Python程序,__name__的值将是一个"__mian__"。

举例说明,根据上面程序做一个测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python
# -*- coding: utf-8 -*-
def  func(a, b):
    return  *  b
class  MyClass:
    def  __init__( self , a, b):
         self .a  =  a
         self .b  =  b
    def  method( self ):
         return  self .a  *  self .b
print  __name__
 
# python test.py
__main__

与预期一样,打印出了“__main__”,再创建一个test2.py,导入这个模块:

1
2
3
4
5
6
#!/usr/bin/python
# -*- coding: utf-8 -*-
import  test
 
# python test2.py
test

打印出了模块名,这个结果输出就是test.py中的print __name__。

所以,我们在test.py里面判断下__name__值等于__main__时说明在手动执行这个程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/python
# -*- coding: utf-8 -*-
def  func(a, b):
    return  *  b
class  MyClass:
    def  __init__( self , a, b):
         self .a  =  a
         self .b  =  b
    def  method( self ):
         return  self .a  *  self .b
if  __name__  = =  "__main__" :
    print  "我在手动执行这个程序..."
    
# python test.py
我在手动执行这个程序...

此时再运行test2.py试试,是不是打印为空!明白了吧!

9.3 安装第三方模块

在Python中安装外部的模块有几种方式:

1)下载压缩包,通过setuptools工具安装,这个在第一章Python基础知识里面用到过。推荐下载地址:http://pypi.python.org

2)easy_install工具安装,也依赖setuptools。

3)pip工具安装。推荐使用这个方式。

4)直接将压缩包解压到Python模块目录。但常常会出现import失败,不推荐。

5)在Windows下,除了上面几种方式以外,可以直接下载exe文件点击一步步安装。

pip与easy_install安装方式类似,主要区别在于easy_install不支持卸载软件,而pip支持。

推荐使用pip命令安装,简单方便。如果安装失败可以按顺序这么尝试:方式1 --> 方式2 --> 方式4

以安装setuptools举例上面几种安装方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
方式 1
# wget https://pypi.python.org/packages/32/3c/e853a68b703f347f5ed86585c2dd2828a83252e1216c1201fa6f81270578/setuptools-26.1.1.tar.gz
# tar zxvf setuptools-26.1.1.tar.gz
# cd setuptools-26.1.1
# python setup.py install
方式 2
# easy_install setuptools
方式 3
# pip install setuptools
# pip uninstall setuptools  # 卸载
# pip search setuptools  # 搜索
方式 3
cp  - rf setuptools - 26.1 . 1  / usr / local / lib / python2. 7 / dist - packages

9.4 查看模块帮助文档

前面几个章节已经使用几个内置模块了,比如collections、itertools等,导入与上面一样,这里不再过多说明了。

1)help()函数

当一个模块对其语法不了解时,可以查看帮助,以collections举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>>  import  collections    
>>>  help (collections)
Help  on module collections:
NAME
   collections
FILE
   / usr / lib / python2. 7 / collections.py
MODULE DOCS
   http: / / docs.python.org / library / collections   # 注意:这里是这个模块的帮助文档,很详细的哦!
CLASSES
    __builtin__. dict (__builtin__. object )
         Counter
         OrderedDict
         defaultdict
    __builtin__. object
         _abcoll. Callable
         _abcoll.Container
     ......

使用help()就能查看这个模块的内部构造,包括类方法、属性等信息。

也可以再对某个方法查看其用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>>  help (collections.Counter())    
Help  on Counter  in  module collections  object :
class  Counter(__builtin__. dict )
      |   Dict  subclass  for  counting hashable items.  Sometimes called a bag
      |   or  multiset.  Elements are stored as dictionary keys  and  their counts
      |  are stored as dictionary values.
     
      |  >>> c  =  Counter( 'abcdeabcdabcaba' )   # count elements from a string
     
      |  >>> c.most_common( 3 )                 # three most common elements
      |  [( 'a' 5 ), ( 'b' 4 ), ( 'c' 3 )]
      |  >>>  sorted (c)                        # list all unique elements
      |  [ 'a' 'b' 'c' 'd' 'e' ]
      |  >>> ''.join( sorted (c.elements()))    # list elements with repetitions
      |   'aaaaabbbbcccdde'
      |  >>>  sum (c.values())                  # total of all counts
      |   15
     
      |  >>> c[ 'a' ]                           # count of letter 'a'
......

一般里面都是举例说明,可快速帮助我们回忆使用方法。

2)dir()函数查看对象属性

这个在前面也用到过,能看到对象的方法、属性等信息:

1
2
     >>>  dir (collections)    
     [ 'Callable' 'Container' 'Counter' 'Hashable' 'ItemsView' 'Iterable' 'Iterator' 'KeysView' 'Mapping' 'MappingView' 'MutableMapping' 'MutableSequence' 'MutableSet' 'OrderedDict' 'Sequence' 'Set' 'Sized' 'ValuesView' '__all__' '__builtins__' '__doc__' '__file__' '__name__' '__package__' '_abcoll' '_chain' '_class_template' '_eq' '_field_template' '_get_ident' '_heapq' '_imap' '_iskeyword' '_itemgetter' '_repeat' '_repr_template' '_starmap' '_sys' 'defaultdict' 'deque' 'namedtuple' ]

3)github上查看模块用法

Python官方模块下载地址http://pypi.python.org,所有的模块在这里都有。

打开网站后,在搜索框搜索你的模块名,在结果找到模块名点进去,会有一个 Home Page的连接,Python大多数模块都是托管在github上面,这个链接就是这个模块在github上面的地址,点击后跳转到github对应的模块页面,里面也有很详细模块使用方法。

9.5 导入模块新手容易出现的问题

还有一个新手经常犯的问题,写一个模块,比如使用itertools模块,为了说明这个测试文件是这个模块,就把文件名写成了这个模块名,于是就造成了下面错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/python
# -*- coding: utf-8 -*-
import  collections
=  collections.Counter()
for  in  "Hello world!" :
    c[i]  + =  1
print  c
 
# python collections.py
Traceback (most recent call last):
   File  "collections.py" , line  3 in  <module>
     import  collections
   File  "/home/user/collections.py" , line  4 in  <module>
     =  collections.Counter()
AttributeError:  'module'  object  has no attribute  'Counter'

抛出异常,明明在解释器里面可以正常导入使用啊,怎么会提示没Counter属性呢,问题就出现你的文件名与导入的模块名重名,导致程序import了这个文件,上面讲过文件名就是模块名。所以文件名不要与引用的模块名相同。

还有一个使用方法也说明下,使用as关键字设置模块别名,这样使用中就不用输入那么长的模块名了,按照上面的例子,把名字先改成collections1.py,做测试:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
# -*- coding: utf-8 -*-
import  collections as cc
=  cc.Counter()
for  in  "Hello world!" :
    c[i]  + =  1
print  c
 
# python collections1.py
Counter({ 'l' 3 'o' 2 '!' 1 ' ' 1 'e' 1 'd' 1 'H' 1 'r' 1 'w' 1 })



本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1866390,如需转载请自行联系原作者
相关文章
|
3天前
|
安全 数据库连接 Python
告别繁琐!自定义Python上下文管理器,让你的资源管理变得如此简单
【7月更文挑战第4天】在Python中,上下文管理器通过`with`语句简化资源管理,确保资源的自动获取与释放,增强程序稳定性。自定义上下文管理器依靠`__enter__`和`__exit__`方法,例如,`CustomFileManager`类展示了如何记录文件操作。自定义管理器能简化代码、保证资源安全释放和提供定制逻辑,从而提升代码的健壮性和可维护性。它是处理文件、连接等资源管理的强大工具。
|
4天前
|
JSON JavaScript 数据格式
|
4天前
|
监控 Python
paramiko 模块 ---Python脚本监控当前系统的CPU、内存、根目录、IP地址等信息
paramiko 模块 ---Python脚本监控当前系统的CPU、内存、根目录、IP地址等信息
|
4天前
|
Python
Python中自定义迭代器
【7月更文挑战第3天】
7 1
|
1天前
|
Python
告别混乱!Python上下文管理器的自定义实践,让你的代码更加整洁有序
【7月更文挑战第6天】Python的上下文管理器通过`__enter__`和`__exit__`方法自动处理资源的获取与释放,如文件操作。使用with语句结合自定义类(如`FileManager`示例),能确保文件在使用后正确关闭,防止资源泄漏,提升代码整洁度和健壮性。自定义上下文管理器是代码模块化和错误处理的好实践。
|
1天前
|
Python
Python大神的秘密武器:揭秘上下文管理器的自定义艺术,让代码更优雅
【7月更文挑战第6天】Python上下文管理器是资源管理的关键,与with语句结合确保自动释放,防止资源泄露。通过定义__enter__和__exit__方法的类或使用contextmanager装饰器的生成器,可自定义管理器,简化代码,增强健壮性,如资源获取与释放、异常处理和高级功能实现。掌握这一技巧能提升代码的优雅度和可维护性。**
|
3天前
|
Python
Python 中 decimal 模块的用法教程
Python 中 decimal 模块的用法教程
5 0
|
4天前
|
数据库连接 数据库 Python
Python 大神教你一招鲜:自定义上下文管理器,让资源管理变得如此轻松惬意🍵
【7月更文挑战第3天】在Python中,自定义上下文管理器是高效资源管理的关键,它们确保了如文件和数据库连接等资源的正确打开和关闭。通过`__enter__`和`__exit__`方法,可以创建简洁的代码,避免冗余的异常处理。例如,自定义的`DatabaseConnectionManager`和`FileManager`类使得数据库操作和文件读取更整洁,使用`with`语句自动处理资源生命周期,提升代码可读性和可靠性。
|
7天前
|
分布式计算 DataWorks 安全
DataWorks产品使用合集之跑python3脚本,已按照文档安装上模块,提示找不到模块,是什么问题
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
10 0
|
9天前
|
机器学习/深度学习 人工智能 程序员
探索Python宝库:从基础到技能的干货知识(数据类型与变量+ 条件与循环+函数与模块+文件+异常+OOP)
探索Python宝库:从基础到技能的干货知识(数据类型与变量+ 条件与循环+函数与模块+文件+异常+OOP)
7 0