Python OOP中修改对象变量后,返回对象还是变量才正确?
我是Python(及整体)面向对象编程(OOP)的新手,想了解修改对象变量的正确方式。由于Python无法返回void,当对象变量被修改时我需要返回一些内容。
现有代码示例:
class classA: var_a = 1 var_b = 1 def changeSomething(classAObj): classAObj.var_a = 2 return classAobj def main(): classAObj = classA() changeSomething(classAObj) # .....使用修改后的对象....
请问在changeSomething函数中返回整个classAObj是否正确?还是应该仅返回被修改的变量,即:
... return classAobj.var_a
两种方式下classAObj.var_a都会被修改,结果一致,但哪种才是正确的做法?
首先纠正一个误区:Python里函数如果不写return语句,默认会返回None,这和其他语言里的void效果等价,并不是必须返回内容。
回到你的问题,两种返回方式都能让主逻辑拿到修改后的结果,但要结合场景选择:
无特殊需求时:不需要返回任何内容
Python里对象是按引用传递的,你在changeSomething里修改对象的属性,主函数里的classAObj本身就已经是修改后的状态了,直接用就行。比如:def changeSomething(classAObj): classAObj.var_a = 2 # 这里不用写return def main(): classAObj = classA() changeSomething(classAObj) print(classAObj.var_a) # 输出2,已经是修改后的值这是最符合Python编程习惯的做法。
需要链式调用时:返回整个对象
如果你的代码需要链式调用(比如obj.method1().method2()这种写法),返回整个对象是合理的,这样可以连续调用多个修改对象的方法。但如果没有这种需求,完全没必要多此一举。仅需立刻使用修改后的单个变量时:可返回该变量,但意义不大
返回classAobj.var_a也能拿到修改后的值,但主函数里直接访问classAObj.var_a就能得到同样结果,这种写法很少见,除非你明确知道调用者只需要这个值。
总结:优先选择不返回任何内容的写法,这是最简洁且符合Python风格的。如果有链式调用需求,再考虑返回整个对象;返回单个变量的做法几乎没必要。
内容的提问来源于stack exchange,提问作者user19699160

