[英]What is the best practice to give a namespace for a bunch of static methods?
我需要一个模块中的命名空间,用于执行类似工作的许多不同 static 方法。 从我的研究中我了解到,在 Python 编程中,拥有一个充满 static 方法的 class 被认为是反模式:
class StatisticsBundle:
@staticmethod
def do_statistics1(params):
pass
@staticmethod
def do_statistics2(params):
pass
如果这不是一个好的解决方案,那么最好的做法是什么?它允许我在同一个模块中进行类似getattr(SomeNameSpace, func_name)
的命名空间查找?
使用 package。 将函数放在单独的模块中,而不使用 class。
在您计算机上的统计文件夹中定义 2 个模块:
helpers.py
用于定义辅助函数。__init__.py
用于编写大部分代码的地方。 如果您可以为您在其中定义的一组函数想出一个更好的名称,您可以重命名helpers
模块。 但是,package 的__init__
模块是特殊的。 当 package 被导入时, __init__
模块被赋予 package 名称并被评估。
要应用您的示例:
#statistics\helpers.py
def do_statistics1(params):
pass
def do_statistics2(params):
pass
# Rest of module omitted
#statistics\__init__.py
# Relative import
from . import helpers
# Get function using getattr()
do_statistics1 = getattr(helpers, "do_statistics1")
# Get function using dot notation
do_statistics2 = helpers.do_statistics2
# Rest of module omitted
请务必通过导入来测试 package。 评估 package 中的模块时,相对导入不起作用。
总之,您可以像从 class 中一样从模块中获取属性。
[...] 最佳
getattr(SomeNameSpace, func_name)
是什么?
Python 函数是一流的函数。 因此,最简单的命名空间是dict
(实际上与实例命名空间在__dict__
上的工作方式相距不远)。 如果你想实现一种工厂 function,它只是:
def _create_foo():
return Foo(...)
def _create_bar():
return Bar(...)
_my_ns = {
'foo': _create_foo,
'bar': _create_bar,
}
def my_factory(name):
return _my_ns[name]()
同样在运行时(考虑到staticmethod
方法描述符在 Python 3 中的工作方式)它们将具有相同的types.FunctionType
。
>>> class ns:
...
... @staticmethod
... def foo():
... pass
...
... type(ns.foo)
<class 'function'>
>>> type(_my_ns['foo'])
<class 'function'>
根据您的 python 版本,您可能可以使用SimpleNamespace
import types
def foo():
print("foo")
def bar():
print("bar")
namespace = types.SimpleNamespace(foo=foo, bar=bar)
namespace.foo()
namespace.bar()
我需要一个模块中的命名空间,用于执行类似工作的许多不同 static 方法。 从我的研究中我了解到,在 Python 编程中,拥有一个充满 static 方法的 class 被认为是反模式:
class StatisticsBundle:
@staticmethod
def do_statistics1(params):
pass
@staticmethod
def do_statistics2(params):
pass
如果这不是一个好的解决方案,那么最好的做法是什么?它允许我在同一个模块中进行类似getattr(SomeNameSpace, func_name)
的命名空间查找?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.