python:具有staticmethods的类vs具有全局变量的模块

时间:2017-01-29 09:08:06

标签: python module singleton global-variables static-methods

我正在研究这个Python模块,它由多个文件组成。这些文件实际上很少是独立的,并且意味着要做一个非常具体的工作。我知道这个文件只有一个实例(模块?),而且不多,因为这种工作是顺序的,只需要一次。

让我们以我目前正在构建的CXXParser模块为例:

例程简单明了 - 获取c ++文件,解析它,然后转换'它是另一回事。由于我来自c ++世界,我立即开始在Python中寻找静态方法和单例。 对于这个例子的使用,我有' public' parse功能,以及许多内部功能该模块的功能,实际解析文件。

我想知道,' Pythonic'这样做的方法?我开始四处寻找正确的方法,但只是感到困惑。因为我想到了单身 - 我看到了this question,并且通过阅读答案,我开始在模块级实现它。但是,再一次,我观看了 Raymond Hettinger,Python核心开发人员的几个视频,他几次提到全局变量不好 ,并且使用类级变量会更好。

这是我目前面临的两个选择:

:一种。使用classmethods类:

#cxxparser.py
class CXXParser(object):
    filename = ''
    cflags   = ''
    translation_unit = None

    def __init__(self, filename, cflags = None):
        super(CXXParser, self).__init__()
        filename = filename
        if cflags:
             cflags = cflags

    @classmethod
    def get_tu(cls):
        'get the tu from the file'
        return tu

    @classmethod
    def parse(cls):
        ...
        #call some inner functions
        #for example:
        translation_unit = cls.get_tu()

从另一个模块使用:

from cxxparser import CXXParser
cxxparser = CXXParser('Foo.c')
cxxparser.parse()

B中。使用模块级函数,使用全局变量:

#cxxparser.py
translation_unit = None
filename = ''

def get_tu(file):
    'get the tu from the file'
    return tu

def parse(filename='', cflags = None):
    global translation_unit
    global filename

    filename = filename
    if cflags:
         cflags = cflags
    ...
    #call some other functions
    translation_unit = get_tu(filename)

从另一个模块使用:

import cxxparser
cxxparser.parse('Foo.C')

P.S。 - 我试着尽我所能阅读,并遇到了这些问题 - module-function-vs-staticmethod-vs-classmethod-vs-no-decorators-which-idiom-is?python-class-design-staticmethod-vs-method,但即使在阅读了更多这些内容之后 - 我仍然无法确定在我的情况下最佳方法。 任何帮助将不胜感激。

0 个答案:

没有答案