在模块和类之间进行选择

Xol*_*lve 17 python oop module

在我的应用程序中,我必须维护一些全局应用程序状态和全局应用程序范围的方法,如当前连接的用户,答案总数,创建应用程序配置文件等.有两个选项:

  1. 创建一个单独的appstate.py文件,其中包含带有函数的全局变量.它最初看起来不错,但似乎我遗漏了一些清晰的代码.

  2. 在appstate.py文件中创建具有类函数的类AppState,所有其他模块都由其特定作业定义.看起来很好.但现在我必须编写更长的行,如appstate.AppState.get_user_list().而且,这些方法并没有太多相互关联.我可以创建单独的类,但这将是太多的类.

编辑:如果我使用类,我将使用classmethods.我认为不需要将类实例化为对象.

Jar*_*die 24

听起来像经典的难题:-).

在Python中,如果这是最好的方法,选择使用模块没有任何肮脏或可耻.毕竟,模块,函数等实际上是语言中的一等公民,并提供许多其他编程语言仅通过使用对象提供的内省和属性.

你描述你的选择的方式,听起来有点像你在这种情况下对基于类的方法并不太疯狂.

我不知道您是否使用过Django框架,但如果没有,请查看有关如何处理设置的文档.这些是应用程序范围的,它们在模块中定义,并且可在全球范围内使用.它解析选项并在全球范围内公开它们的方式非常优雅,您可能会发现这种方法可以满足您的需求.

  • +1:什么 - 真的 - 模块(带有模块属性和函数)和只有类变量和类方法的类之间的区别?没有,真的.模块预期为单例.一堂课没有这样的期望. (2认同)

Dev*_*rre 5

如果您将应用程序状态存储在AppState 实例中,则第二种方法与第一种方法明显不同,在这种情况下,您的投诉不适用.如果你只是在一个类中存储东西并使用静态/类方法,那么你的类与一个模块没什么区别,而实际上将它作为一个模块就是pythonic.


nos*_*klo 4

第二种方法似乎更好。我只会将第一个用于配置文件或其他内容。

无论如何,为了避免这个问题,你总是可以:

from myapp.appstate import AppState
Run Code Online (Sandbox Code Playgroud)

这样你就不用再写很长的一行了。