面向对象编程中的Python参数传递
如果之前有人问过这个问题,我很抱歉,但我不知道该怎么问。
我是一名物理学家,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
要干净得多。你更喜欢哪种方式,或者我这样做是不是违反了面向对象的原则?
从性能上来说,这样应该没什么区别,因为参数是通过引用传递的,对吧?
2 个回答
我应该主要传递参数,还是直接操作对象的数据呢?
可以把对象想象成一个有状态的系统。如果某些数据是这个对象状态的一部分,那就应该把它放在对象里面,作为它的成员。否则,就应该把这些数据作为参数传递给对象的方法。
在你的例子中,你该怎么做取决于你是否想对不属于对象的值 x
和 y
进行 dosomething
操作。如果不想,那你可以让 dosomething
从 self
中获取 x
和 y
。
另外,要记住,如果你在一个方法里没有使用 self
,那么这个方法可能就不应该存在,应该改成一个独立的函数。
从性能的角度来看,这应该没有区别,因为参数是通过引用传递的,对吧?
在这个阶段,我觉得你根本不需要担心性能问题。
对象范式的意思是:你把方法和属性放在一起,称之为一个对象。
所以,如果你只想操作这个对象的某个属性,就不需要把它作为参数传递,你应该直接使用对象里的属性。如果你用其他的东西,那就得把它作为参数传递。
而且,如果你觉得每次都写“self”很麻烦,完全可以把对象的值放到另一个变量里,这样就不用每次都写了!
最后,如果你的函数需要用到x和y作为参数,最好把这个函数放在对象外面,作为一个辅助函数。原因是,如果你不使用对象,就没有必要把它作为第一个参数传递(即使是隐式的)。
而且,从性能上来说,效果应该差不多!