Skip to main content
 首页 » 编程设计

python之如何建立Python项目

2025年05月04日11myhome

我正在做一些繁重的命令行工作(不是真正的基于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模块)。