Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象创建的Python最佳实践_Python_Design Patterns - Fatal编程技术网

对象创建的Python最佳实践

对象创建的Python最佳实践,python,design-patterns,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

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

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

情况就是这样:

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
返回一个字典。我认为将其作为单独的函数来执行并不方便,因为这些方法特定于将它们转换为函数的
示例
,而且还因为它们使用self的参数


有什么建议吗?

如果你真的想保留你的
示例
类,但只需要实例来计算值和创建结果dict,你可以将它包装在一个函数中:

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()
编辑:

从设计模式的角度来看,是执行您展示的第一个示例更好,还是分离函数中的所有方法(特定于该类)并消除该类更好

这实际上与设计模式无关——这里没有设计模式,所以问“从设计模式的角度看”哪种解决方案更好是没有意义的

从设计角度来看,也没有“一刀切”的答案——这实际上取决于具体的用例、对象的责任、专门化/多态性的需求等。这里的答案也只能对Python有效——“给定解决方案的最佳设计也取决于语言

话虽如此,这里的第一个要素是您是否(或可以预见在不久的将来)需要专门化/多态性。如果您知道(或可能很快)需要专门化
示例
,您希望将其作为类保留,并使用基于类方法的
get\u values()
版本

另外,接下来要考虑的是你是否真的需要一个类。如果你有一个复杂的状态(几十个属性等),并且一些方法可能会改变其他方法所使用的状态的一部分,那么使用一个类(实际上是一个实例,但是这需要一个类)。可以比在函数之间传递所有必要的值更实用

如果不是这样的话——即在函数之间只需要传递三个参数,从一个函数调用到另一个函数调用不需要复杂的状态等等——那么使用一个类可能有点过火,而且由于Python不需要类,您确实可以将其重构为普通函数——但是如果您已经有了一个正在测试的、经过测试的实现

编辑#2


我在寻找用Python编写JS代码的最佳方法

Python不是JS

这就是它的外观。基本上它有一个默认函数(导出默认函数),并且它使用了很多“内部方法”来修改函数值,比如force、apply、prepare)。您知道在Python中实现类似功能的最佳方法吗?github.com/d3/d3-force/blob/master/src/collide.js

Python也有闭包,但是惯用的Python将使用类(正如老话所说:)来处理比decorator或简单回调更复杂的事情


根据我对这个js代码段的理解,默认的
collide
函数返回
force
函数,该函数具有其他函数作为属性,所有这些函数都在闭包中存储的状态下工作。如果这是正确的,基于Python的OO等价物将是-js
force
函数
Example.\uuuu调用\uuuuu
,其他函数(apply etc)被实现为普通方法。

如果要返回字典,为什么要创建
Example
类?只需创建一个返回字典的函数。@Aran Fey,正如我所说的“我只能使用一个函数,但实际情况是,通过在对象创建过程中传递的参数,可以执行某些操作。“@nikolat328我不明白。你的类没有方法。把它重写成函数是件小事。@Aran Fey我的错。我更新了问题。谢谢你让我知道!在你的例子中,
e.values
是什么?我喜欢第一种方法!我想我会使用它,在这种情况下,我更新了我的问题:从设计模式的角度来看,执行您展示的第一个示例,还是分离函数中的所有方法(特定于该类)并删除该类更好?参见我编辑的答案。我在寻找用Python编写JS代码的最佳方法。这就是它的样子。基本上,它有一个默认函数(
export default function
),并使用许多“内部方法”来修改函数值,如
force
apply
prepare
)。您知道在Python中实现类似功能的最佳方法吗?cf我重新编辑的答案。