【发布时间】:2014-10-08 12:00:17
【问题描述】:
我已阅读 this SO discussion 关于工厂方法的内容,并且有一个 alternate constructor 用例。
我的班级是这样的:
class Foo(object):
def __init__(self, bar):
self.bar = bar
@classmethod
def from_data(cls, datafile):
bar = datafile.read_bar()
# Now I want to process bar in some way
bar = _process_bar(bar)
return cls(bar)
def _process_bar(self, bar)
return bar + 1
我的问题是,如果 @classmethod 工厂方法想要在其代码中使用函数,那么该函数 (_proces_bar) 是否应该是:
-
@classmethod,这似乎有点奇怪,因为你永远不会像Foo._process_bar()这样称呼它 - 类
Foo之外但在同一个.py文件中的方法。我会用这个,但它似乎有点奇怪。这些方法是否总是可用于Foo的实例,无论它是如何实例化的? (例如,如果将其保存到 Pickle 然后重新加载怎么办?大概类外的方法将不可用!) -
@staticmethod? (见 1。这看起来很奇怪) - 还有别的吗? (但不是this!)
【问题讨论】:
-
如果
process只在from_data中使用,则使其成为本地函数。否则,我会使用模块级函数。能否详细说明一下导入问题? -
您为什么认为将其设为
@staticmethod会很奇怪?只需用def _process_bar(bar):声明它,然后用cls._process_bar(bar)在from_data()中调用它。
标签: python coding-style