用于对象创建的Python最佳实践

时间:2018-10-29 12:21:30

标签: python design-patterns

我坚持创建以下对象的最佳方法:

我需要在创建对象时返回一个字典。我本可以只使用一个函数,但实际情况是,使用在创建对象时传递的参数,可以执行某些操作。

这种情况:

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的参数。

有什么建议吗?

1 个答案:

答案 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__,而其他函数(应用等)被实现为简单方法。