【问题标题】:Python argument passing in object oriented programming面向对象编程中的 Python 参数传递
【发布时间】:2011-11-22 10:48:49
【问题描述】:

如果有人在其他地方问过这个问题,我深表歉意,但我不知道如何提出这个问题。

我是物理学家,Python 是我的第一个面向对象的语言。我喜欢这种语言,因为它的代码简洁,并且不知何故,一切都按预期工作(由我;)。

但是我有一个问题,也许它更多是一种设计选择,但由于我的面向对象编程是自学的并且非常基础,我不知道该走哪条路。

所以问题是:我应该主要传递参数还是直接操作对象数据?因为,例如:

class test(object):

    ...

    def dosomething(self, x, y):
        # do someting with x, y involving a lot of mathematic manipulations

    def calcit(self):
        k = self.dosomething(self.x[i], self.y[i])
        # do something else with k

产生的代码比不传递x, y 而是传递i 并每次都显式编写self 更简洁。您更喜欢什么,或者这是我正在打破的面向对象的范式?

在性能方面这不应该有什么不同,因为参数是通过引用传递的,对吧?

【问题讨论】:

  • 尝试使用某种方式来区分函数名称中的单词,例如calc_itdo_something

标签: python oop arguments


【解决方案1】:

我应该主要是传递参数还是直接操作对象数据

将对象视为具有状态的系统。如果数据属于对象的状态,那么它应该作为成员封装在对象中。否则,它应该作为参数传递给它的方法。

在您的示例中,您应该做什么取决于您是否要对不是对象成员的值 xy 进行 dosomething。如果你不这样做,那么你可以让dosomethingself 获取xy

另外,请记住,如果您没有在方法中使用self,那么它可能根本不应该是一个方法,而是一个独立的函数。

就性能而言,这应该不会产生影响,因为参数是通过引用传递的,对吧?

我现在完全不用担心性能。

【讨论】:

  • +1,我见过很多糟糕的代码,因为它在性能相当不重要的程序部分性能好得多
  • 同意,尤其是当您是初学者时,目标是编写干净的代码,而不是快速的代码。无论如何,你最终会得到更快的代码。
  • 我不是一般的初学者,而是 oop 的初学者,我认为如果您不必要地复制大型数据数组,它会有所作为
【解决方案2】:

对象范式是: 您将方法和属性打包在一起,然后将它们称为对象。

因此,如果您精确地操作这些属性之一,您不需要将它们作为参数传递,您应该使用对象的属性。如果你使用其他任何东西,那么你必须将它作为参数传递。

如果你每次都写 self 很麻烦,没有什么能阻止你将对象的值放入另一个变量中!

最后,以 x 和 y 作为参数的函数不应该在你的对象中,而是在它之外作为辅助函数,如果你真的想做这样的事情,原因是没有理由传递你的对象如果你不使用它,作为第一个参数(即使它是隐式的)。

是的,性能方面应该非常相似!

【讨论】:

  • 即使它不会改变对象的外观?忽略例如 exp(- 1j * x * y) 比 exp(- 1j * self.x[i] * self.y[i]) 更具可读性?
  • 外观是什么意思?如果您的意思是它不会更改任何对象属性的值,那么您有两种情况: - 它返回一个取决于这些对象值之一的值,那么没关系 - 它只接受外部参数并计算它们,那么它应该在你的对象之外。关于可读性,你可以用 x, y = self.x[i], self.y[i] 开始你的函数,现在你有了你的值并且它是可读的!
  • 第一种情况适用,我想我是一个极简主义者,而 x, y = self.x[i]... 似乎是不必要的代码行
  • 如果它使你的函数的其余部分更具可读性,请不要犹豫:)
  • 请注意,您已经拥有x, y = self.x[i], self.y[i]。左侧(x, y)在方法参数定义中,右侧在调用站点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 2017-04-23
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多