我正在做一些繁重的命令行工作(不是真正的基于Web的),并且是Python的新手,所以我想知道如何设置文件/文件夹/等。是否可以在其中保留所有数据库连接内容的“头”文件?
如何/在哪里定义类和对象?
请您参考如下方法:
仅举一个典型的Python模块源代码为例,这里有一些解释。这是一个名为“ Dims.py”的文件。这不是整个文件,而只是一些部分可以让您了解发生了什么。
#!/usr/bin/env python
这是告诉外壳程序如何执行此文件的标准第一行。用
/usr/bin/env python代替
/usr/bin/python告诉外壳程序通过用户的PATH查找Python。所需的Python可能在
~/bin或
/usr/local/bin中。
"""Library for dealing with lengths and locations."""
如果文件中的第一件事是字符串,则为模块的文档字符串。文档字符串是在项目开始后立即显示的字符串,可以通过其
__doc__属性对其进行访问。在这种情况下,由于它是模块的文档字符串,因此如果用户使用
import Dims导入此文件,则
Dims.__doc__将返回此字符串。
# Units
MM_BASIC = 1500000
MILS_BASIC = 38100
IN_BASIC = MILS_BASIC * 1000
在称为 PEP (Python Enhancement Proposal) 8的文档中,有许多关于格式设置和命名约定的良好准则。这些是模块级变量(实际上是常量),因此它们全部用大写字母加下划线表示。不,我不遵守所有规则;旧习难改。由于您是从新开始的,除非没有,否则请遵循PEP 8。
_SCALING = 1
_SCALES = {
mm_basic: MM_BASIC,
"mm": MM_BASIC,
mils_basic: MILS_BASIC,
"mil": MILS_BASIC,
"mils": MILS_BASIC,
"basic": 1,
1: 1
}
这些模块级变量的名称中带有前导下划线。这给了他们有限的“隐私”数量,因为
import Dims不允许您访问
Dims._SCALING。但是,如果您需要弄乱它,则可以明确地说出类似
import Dims._SCALING as scaling之类的内容。
def UnitsToScale(units=None):
"""Scales the given units to the current scaling."""
if units is None:
return _SCALING
elif units not in _SCALES:
raise ValueError("unrecognized units: '%s'." % units)
return _SCALES[units]
UnitsToScale是模块级功能。注意文档字符串以及默认值和异常的使用。默认值声明中
=周围没有空格。
class Length(object):
"""A length. Makes unit conversions easier.
The basic, mm, and mils properties can be used to get or set the length
in the desired units.
>>> x = Length(mils=1000)
>>> x.mils
1000.0
>>> x.mm
25.399999999999999
>>> x.basic
38100000L
>>> x.mils = 100
>>> x.mm
2.54
"""
类声明。请注意,文档字符串中包含类似于Python命令行命令的内容。这些护理称为doctests,因为它们是docstring中的测试代码。稍后再详细介绍。
def __init__(self, unscaled=0, basic=None, mm=None, mils=None, units=None):
"""Constructs a Length.
Default contructor creates a length of 0.
>>> Length()
Length(basic=0)
Length(<float>) or Length(<string>) creates a length with the given
value at the current scale factor.
>>> Length(1500)
Length(basic=1500)
>>> Length("1500")
Length(basic=1500)
"""
# Straight copy
if isinstance(unscaled, Length):
self._x = unscaled._x
return
# rest omitted
这是初始化程序。与C ++不同,您只能得到一个,但是可以使用默认参数使它看起来像几个可用的构造函数。
def _GetBasic(self): return self._x
def _SetBasic(self, x): self._x = x
basic = property(_GetBasic, _SetBasic, doc="""
This returns the length in basic units.""")
这是一个属性。它允许您具有getter / setter函数,同时使用与访问任何其他数据成员相同的语法,在这种情况下,
myLength.basic = 10的作用与
myLength._SetBasic(10)相同。因为您可以执行此操作,所以默认情况下不应为数据成员编写getter / setter函数。只需直接对数据成员进行操作即可。如果以后需要使用getter / setter函数,则可以将数据成员转换为属性,而模块的用户则无需更改其代码。请注意,文档字符串位于属性上,而不是getter / setter函数。
如果您具有只读属性,则可以使用
property作为修饰符来声明它。例如,如果上述属性是只读的,我会写:
@property
def basic(self):
"""This returns the length in basic units."""
return self._x
请注意,属性的名称是getter方法的名称。您还可以使用装饰器在Python 2.6或更高版本中声明setter方法。
def __mul__(self, other):
"""Multiplies a Length by a scalar.
>>> Length(10)*10
Length(basic=100)
>>> 10*Length(10)
Length(basic=100)
"""
if type(other) not in _NumericTypes:
return NotImplemented
return Length(basic=self._x * other)
这将覆盖
*运算符。请注意,您可以返回特殊值
NotImplemented来告诉Python未实现此操作(在这种情况下,如果您尝试乘以字符串之类的非数字类型)。
__rmul__ = __mul__
由于代码只是一个值,所以您可以将一种方法的代码分配给另一种方法。此行告诉Python
something * Length操作使用与
Length * something相同的代码。不要重复自己。
现在已经声明了该类,现在我可以回到模块代码。在这种情况下,我有一些仅在此文件本身执行时才要运行的代码,而不是如果将其作为模块导入时才要运行。因此,我使用以下测试:
if __name__ == "__main__":
然后,仅在直接运行
if中的代码时才执行。在此文件中,我有以下代码:
import doctest
doctest.testmod()
这将遍历模块中的所有文档字符串,并查找类似于Python提示符并在其后带有命令的行。假定以下几行是命令的输出。如果命令输出其他内容,则认为测试失败,并打印实际输出。阅读 doctest模块文档以获取所有详细信息。
关于doctest的最后一点说明:它们很有用,但不是可用的最通用或最全面的测试。对于这些,您将需要阅读单元测试( unittest模块)。
