面向对象编程中的Python参数传递

5 投票
2 回答
3707 浏览
提问于 2025-04-17 06: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 要干净得多。你更喜欢哪种方式,或者我这样做是不是违反了面向对象的原则?

从性能上来说,这样应该没什么区别,因为参数是通过引用传递的,对吧?

2 个回答

4

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

可以把对象想象成一个有状态的系统。如果某些数据是这个对象状态的一部分,那就应该把它放在对象里面,作为它的成员。否则,就应该把这些数据作为参数传递给对象的方法。

在你的例子中,你该怎么做取决于你是否想对不属于对象的值 xy 进行 dosomething 操作。如果不想,那你可以让 dosomethingself 中获取 xy

另外,要记住,如果你在一个方法里没有使用 self,那么这个方法可能就不应该存在,应该改成一个独立的函数。

从性能的角度来看,这应该没有区别,因为参数是通过引用传递的,对吧?

在这个阶段,我觉得你根本不需要担心性能问题。

2

对象范式的意思是:你把方法和属性放在一起,称之为一个对象。

所以,如果你只想操作这个对象的某个属性,就不需要把它作为参数传递,你应该直接使用对象里的属性。如果你用其他的东西,那就得把它作为参数传递。

而且,如果你觉得每次都写“self”很麻烦,完全可以把对象的值放到另一个变量里,这样就不用每次都写了!

最后,如果你的函数需要用到x和y作为参数,最好把这个函数放在对象外面,作为一个辅助函数。原因是,如果你不使用对象,就没有必要把它作为第一个参数传递(即使是隐式的)。

而且,从性能上来说,效果应该差不多!

撰写回答