编写你自己的Python模块
其实网上Python教程挺多的,编写你自己的模块很简单,这其实就是你一直在做的事情!这是因为每一个 Python 程序同时也是一个模块。你只需要保证它以 .py
为扩展名即可。下面的案例会作出清晰的解释。
案例(保存为 mymodule.py
):
def say_hi(): print('Hi, this is mymodule speaking.') __version__ = '0.1'
上方所呈现的就是一个简单的模块。正如你所看见的,与我们一般所使用的 Python 的程序相比其实并没有什么特殊的区别。我们接下来将看到如何在其它 Python 程序中使用这一模块。
要记住该模块应该放置于与其它我们即将导入这一模块的程序相同的目录下,或者是放置在 sys.path
所列出的其中一个目录下。
另一个模块(保存为 mymodule_demo.py
):
import mymodule mymodule.say_hi() print('Version', mymodule.__version__)
输出:
$ python mymodule_demo.py Hi, this is mymodule speaking. Version 0.1
它是如何工作的
你会注意到我们使用相同的点符来访问模块中的成员。Python 很好地重用了其中的符号,这充满了“Pythonic”式的气息,这使得我们可以不必学习新的方式来完成同样的事情。
下面是一个使用 from...import
语法的范本(保存为 mymodule_demo2.py
):
from mymodule import say_hi, __version__ say_hi() print('Version', __version__)
mymodule_demo2.py
所输出的内容与 mymodule_demo.py
所输出的内容是一样的。
在这里需要注意的是,如果导入到 mymodule 中的模块里已经存在了 __version__
这一名称,那将产生冲突。这可能是因为每个模块通常都会使用这一名称来声明它们各自的版本号。因此,我们大都推荐最好去使用 import
语句,尽管这会使你的程序变得稍微长一些。
你还可以使用:
from mymodule import *
这将导入诸如 say_hi
等所有公共名称,但不会导入 __version__
名称,因为后者以双下划线开头。
警告:要记住你应该避免使用 import 这种形式,即 `from mymodule import `。
Python 之禅
Python 的一大指导原则是“明了胜过晦涩”2。你可以通过在 Python 中运行
import this
来了解更多内容。
python dir()函数
内置的 dir()
函数能够返回由对象所定义的名称列表。 如果这一对象是一个模块,则该列表会包括函数内所定义的函数、类与变量。
该函数接受参数。 如果参数是模块名称,函数将返回这一指定模块的名称列表。 如果没有提供参数,函数将返回当前模块的名称列表。
案例:
$ python >>> import sys # 给出 sys 模块中的属性名称 >>> dir(sys) ['__displayhook__', '__doc__', 'argv', 'builtin_module_names', 'version', 'version_info'] # 此处只展示部分条目 # 给出当前模块的属性名称 >>> dir() ['__builtins__', '__doc__', '__name__', '__package__','sys'] # 创建一个新的变量 'a' >>> a = 5 >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'a'] # 删除或移除一个名称 >>> del a >>> dir() ['__builtins__', '__doc__', '__name__', '__package__']
它是如何工作的
首先我们看到的是 dir
在被导入的 sys
模块上的用法。我们能够看见它所包含的一个巨大的属性列表。
随后,我们以不传递参数的形式使用 dir
函数。在默认情况下,它将返回当前模块的属性列表。要注意到被导入模块的列表也会是这一列表的一部分。
给了观察 dir
函数的操作,我们定义了一个新的变量 a
并为其赋予了一个值,然后在检查 dir
返回的结果,我们就能发现,同名列表中出现了一个新的值。我们通过 del
语句移除了一个变量或是属性,这一变化再次反映在 dir
函数所处的内容中。
关于 del
的一个小小提示——这一语句用于删除一个变量或名称,当这一语句运行后,在本例中即 del a
,你便不再能访问变量 a
——它将如同从未存在过一般。
要注意到 dir()
函数能对任何对象工作。例如运行 dir(str)
可以访问 str
(String,字符串)类的属性。
同时,还有一个 vars()
函数也可以返回给你这些值的属性,但只是可能,它并不能针对所有类都能正常工作。