我有~30种方法(约6个逻辑分组,每组约5个方法)只根据传递的参数进行计算,它们不保存状态或需要除参数值旁边的任何其他内容。
使用模块或使用静态方法的类对此方法进行分组的pythonic和更好的方法是什么?
差异将是:
from projectname.algorithms.module1 import method1, method2
和:
from projectname.algorithms import Group1
...
Group1.method1(parameter1)
...
Group1.method2(parameter1)
这只是示例类,模块和方法名称。对类进行分组似乎对我更合乎逻辑。如果经常访问这些方法或任何其他警告,这种方式有任何缺点吗?
答案 0 :(得分:5)
您可以像对待任何对象一样将模块导入命名空间:
from projectname.algorithms import module1
module1.method1(parameter1)
module1.method2(parameter1)
因此从API的角度来看,使用静态方法的类或此处的模块没有区别。
区别仅在于写作和维护。
这里,坚持使用静态类方法的模块。仅在有一些实际状态要共享时使用类。如果您要使用类来对这些方法进行分组,那么您确实希望类对象本身具有某些意义,除了促进命名空间分组之外。
答案 1 :(得分:2)
模块只是将自己粘贴在sys.modules
。
如果你使用一个类,你将能够初始化它,并且个人非常困惑:当你提供功能时它应该做一些事情。您可以随时使用初始化的一次性课程,但这有点麻烦。
我在某种意义上使用了这两种方法;我使用装饰器将类更改为命名空间(def namespace(cls): return cls()
),但它感觉像是一个黑客,我不会真的推荐它。这取决于命名空间的大小。
如果您的名称空间是中到大,请使用模块。如果您有许多小模块,那么您可以选择。如果你使用类,要么众所周知不要初始化它们(重载__init__
以抛出错误)或初始化它们。此外,由于您没有将它们用作类,我建议不使用ClassNamingSchemes,而是使用module_naming_schemes。如果它像一个模块一样嘎嘎叫,它的味道就像一个模块,那么该死的我今晚正在制作模块汤!
对这篇文章缺乏连贯性表示歉意。