【问题标题】:Python best practice for object creation [duplicate]用于创建对象的 Python 最佳实践 [重复]
【发布时间】:2019-04-02 09:06:59
【问题描述】:

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

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

情况是这样的:

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

有什么建议吗?

【问题讨论】:

  • 如果你想返回一个字典,你为什么要做Example 类?只需创建一个返回字典的函数。
  • @Aran-Fey 正如我所说“我本可以只使用一个函数,但现实情况是,在创建对象时传递的参数会执行某些操作。”
  • @nikolat328 我不关注。你的类没有方法。将其重写为函数很简单。
  • @Aran-Fey 我的错。我更新了问题。谢谢你告诉我!
  • 在您的示例中,e.values 是什么?

标签: python design-patterns


【解决方案1】:

如果你真的想保留你的 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 sn-p的理解,默认的collide函数返回force函数,该函数还有其他函数作为属性,所有这些函数都对存储在闭包中的状态起作用。如果这是正确的,基于 Pythonic OO 的等价物将是 make your example class callable - js force 函数变为 Example.__call__,并且其他函数(应用等)被实现为普通方法。

【讨论】:

  • 我喜欢第一种方法!我想我会使用它,在这种情况下我会更新我的问题:从设计模式的角度来看,执行您展示的第一个示例或分离函数中的所有方法(特定于该类)是否更好并消除类?
  • cf 我编辑的答案。
  • 我一直在寻找用 Python 编写 JS 代码的最佳方法。这就是它的外观。基本上它有一个默认函数(export default function),它使用很多“内部方法”来修改函数值,比如forceapplyprepare)。您知道在 Python 中实现类似功能的最佳方法吗? github.com/d3/d3-force/blob/master/src/collide.js
  • 参考我重新编辑的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2017-09-21
相关资源
最近更新 更多