我坚持创建以下对象的最佳方法:
我需要在创建对象时返回一个字典。我本可以只使用一个函数,但实际情况是,使用在创建对象时传递的参数,可以执行某些操作。
这种情况:
class Example(object):
def __init__(self, param_a, param_b, param_c):
self.a = param_a
self.b = param_b
self.c = param_c
_tmp_1 = self._complex_function_1()
_tmp_2 = self._complex_function_2()
_tmp_3 = self._complex_function_3()
# I need here to return a dictionary. Now I'm saving the
# result in a variable call "self.values" and then access to
# it from the object created, but I don't like this approach...
def _complex_function_1(self):
# Make some calculations using "self"
def _complex_function_2(self):
# Make some calculations using "self"
def _complex_function_3(self):
# Make some calculations using "self"
当我使用它时,我必须执行以下操作:
e = Example(a, b, c)
dict_values = e.values
简而言之:我要的是让Example
返回字典。我认为将其作为单独的函数进行操作并不方便,因为这些方法特定于Example
才能将它们转换为函数,并且因为它们使用self的参数。
有什么建议吗?
答案 0 :(得分:2)
如果您确实想保留Example
类,但只需要实例来计算值并创建结果字典,则可以将其包装在函数中:
def get_values(param_a, param_b, param_c):
e = Example(param_a, param_b, param_c)
return e.values()
或将其设为类方法:
class Example(object):
# ...
@classmethod
def get_values(cls, param_a, param_b, param_c):
e = cls(param_a, param_b, param_c)
return e.values()
编辑:
从设计模式的角度来看,执行显示的第一个示例或分离函数中的所有方法(特定于该类的方法)并消除该类,是否更好?
这实际上与设计模式无关-无论如何这里都没有涉及设计模式,因此询问哪种解决方案“从设计模式的角度来看更好”是没有道理的。
从设计POV来看,也没有“一刀切”的答案-它实际上取决于具体的用例,对象的责任感,特殊化/多态性的需求等。这里的答案也仅对Python有效- “给定解决方案的最佳设计也取决于语言。
这就是说,这里的第一个要素是您是否(或可以在不久的将来预见)对专业化/多态性的需求。如果您知道(或可能很快)需要专门研究Example
,则希望将其保留为一个类,并使用基于类方法的get_values()
。
否则,接下来要考虑的是您是否真的真的需要一堂课。如果您具有复杂的状态(数十个属性等),并且某些方法可能会更改其他方法使用的状态的一部分,那么使用类(嗯,实际上是一个实例,但这需要一个类)比传递方法更实用。从功能到功能的所有必要值。
如果不是这种情况,即从函数到函数只有三个参数,从一个函数调用到另一个函数之间没有复杂的状态,等等,那么使用类可能有点过头了,因为Python不会不需要类,您确实可以将其重构为简单的函数-但是,如果您已经有一个经过测试的有效实现,那么值得吗?
编辑#2
我一直在寻找用Python编写JS代码的最佳方法。
Python不是JS。
这是它的外观。基本上,它具有默认功能(导出默认功能),并且它使用许多“内部方法”来修改函数值,例如强制,应用,准备。您知道在Python中实现类似内容的最佳方法吗? github.com/d3/d3-force/blob/master/src/collide.js
这是a closure。 Python也有闭包,但是惯用的Python将使用类(如俗话所说的closures are the poor man's objects - and vice-versa)来代替装饰器或简单的回调,从而涉及更多的事情。
据我对这个js代码段的了解,默认的collide
函数返回force
函数,该函数还有其他函数作为属性,所有这些函数都作用于存储在闭包中的状态。如果是正确的话,则基于Python OO的等效项将是make your example class callable-js force
函数变成Example.__call__
,而其他函数(应用等)被实现为简单方法。