-1

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

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

这是这种情况:

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

有什么建议么?

4

1 回答 1

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

这是一个闭包。Python 也有闭包,但惯用的 Python 将使用类代替(正如老话所说:闭包是穷人的对象 - 反之亦然)用于比装饰器或简单回调更复杂的任何事情。

根据我对这个 js 片段的理解,默认collide函数返回该force函数,该函数具有其他函数作为属性,所有这些函数都对存储在闭包中的状态起作用。如果这是正确的,基于 Pythonic OO 的等价物将使您的示例类可调用- jsforce函数变为Example.__call__,而其他函数(应用等)被实现为普通方法。

于 2018-10-29T12:31:48.213 回答