【问题标题】:Which is "better" practice? Passing object references or object method references in Python哪个是“更好”的做法?在 Python 中传递对象引用或对象方法引用
【发布时间】:2011-01-09 19:25:14
【问题描述】:

我正在用 Python 编写一小段代码,很好奇其他人对此有何看法。

我有几个类,每个类都有几个方法,并且正在尝试确定什么是“更好”:通过方法调用传递对象,或者在只需要来自对象的一种方法时通过方法调用传递方法。基本上,我应该这样做:

def do_something(self, x, y, manipulator):
    self.my_value = manipulator.process(x, y)

或者这个

def do_the_same_thing_but_differently(self, x, y, manipulation):
    self.my_value = manipulation(x, y)

在我看来,第二个可以说是“更好”,因为它促进了操作和其他类之间更松散的耦合/更强的内聚。对于对象只需要一个方法的情况,我很想看到一些支持和反对这种方法的论据。

编辑:我删除了 OOP 措辞,因为它显然令人不安。我主要指的是松耦合和高内聚。

【问题讨论】:

  • 更强的 OOP?你用什么来衡量 OOP 的“强度”?我以前从未见过这种情况。你有报价或链接吗?
  • 什么是“更好”取决于您要达到的目标。如果函数只对调用该方法感兴趣,则传递该方法会给您更大的灵活性(您可以给它任何可调用的)。另一方面,如果它想对 manipulator 对象做任何其他事情,或者如果你想确保你只是调用一个特定的方法,你必须使用第一个方法。
  • 那是耦合,不是 OO。我很好奇您对“Stronger OOP”短语的使用。我对“强耦合”和“松耦合”并不好奇。
  • “明显令人不安”?也许你的意思是“令人困惑”。

标签: python oop functional-programming loose-coupling cohesion


【解决方案1】:

第二种解决方案可能提供更松散的耦合,因为它更具“功能性”,而不是更多“OOP”。第一个解决方案的优点是它可以在没有闭包的 C++ 之类的语言中工作(尽管使用模板和指向成员函数的指针可以获得类似的效果);但是在像 Python 这样的语言中,恕我直言,第二种选择似乎更“自然”。

编辑:您会在免费书籍“Higher order Perl”中找到关于“功能与面向对象”技术的非常好的讨论,可在此处获得:

http://hop.perl.plover.com/

(查看第 1 章,第 6 部分)。虽然这是一本 Perl(而不是 Python)的书,但那里的讨论完全符合这里提出的问题,并且那里描述的函数技术可以以类似的方式应用于 Python。

【讨论】:

  • 同意。如果“manipulator”的唯一目的是提供“process”函数,那么传递函数本身而不是传递对象肯定更 Pythonic。
  • 问题来了。 “更多功能”是否符合“更强的 OOP”标准?或者更多功能意味着“较弱的OOP”?我认为这个问题——正如所写的——真的很难直接回答。
  • 恕我直言,“功能性”和“面向对象”大多是正交范式。因此“功能性更强”并不意味着“或多或少 OOP”,反之亦然。
  • @Doc Brown:“所以“功能性更强”并暗示...”无限多的事情。这意味着什么? “更多功能”是否符合“更强的 OOP”标准?或者“更多功能”是否意味着“更弱的 OOP”?
  • @S.洛特:抱歉,我对哲学讨论不感兴趣。也许您可以尝试查看我在上面提供链接的免费书籍的第一章,并形成您自己的观点。
【解决方案2】:

我会说第二种方法;因为它绝对看起来像 callback,它们在使用 Hollywood principle 时非常常用(不要打电话给我们,我们会打电话给你),这是一种有助于开发高内聚和低耦合代码的范例 [参考2] .

【讨论】:

    【解决方案3】:

    我肯定会选择第二种方法。

    还考虑到您可以更改任何 Manipulator 类的接口,以便将 process 拼写为 __call__,然后它可以透明地使用第二种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-12
      • 2012-05-20
      • 2015-03-06
      • 2021-11-30
      • 2022-12-14
      • 2015-10-27
      • 2018-11-13
      • 1970-01-01
      相关资源
      最近更新 更多