Python实践:通过"引用"传递的参数

Zau*_*bov 1 python arguments

考虑一个类的实例:

class Car(object):
    def __init__(self):
        self.engine = None
Run Code Online (Sandbox Code Playgroud)

还有一个修改该实例的函数:

def add_engine(car):
    car.engine = 'V6'
Run Code Online (Sandbox Code Playgroud)

Python没有隐含的技术指出将修改参数.我能想到的最好的解决方案是返回修改后的对象(即使它将作为参数传递给同一个对象):

def add_engine(car):
    car.engine = 'V6'
    return car
Run Code Online (Sandbox Code Playgroud)

你会如何解决这个设计问题?

-

伙计们,非常感谢你的回答.你的建议有助于清除我脑子里的烂摊子:)

kjo*_*kjo 7

FWIW,我注意到在Python世界中,有副作用的函数/方法(例如你要问的那个)总是返回None.(这是通过使用return不带参数的语句隐式完成的,或者只是return完全省略.)

例如,比较sorted内置函数,该函数返回一个新的列表(当然是已排序的),并list.sort返回返回的方法None,因为在这种情况下,列表会按顺序排序.类似的情况适用于reversed内置功能和list.reverse方法的情况.

因此,IMO,只是让你的函数(隐式)返回None就足以提醒用户这个函数有副作用(因为,没有副作用,一个总是返回的函数None基本上是一个无操作)通常的"Pythonic"方式.


Fre*_*Foo 5

我倾向于使这些东西返回的方法self。这允许构造像

car = Car().add_engine().add_wheels()
Run Code Online (Sandbox Code Playgroud)

有时在 Python 标准库中使用的另一个选项是不返回任何内容。这应该是为了防止混淆,并在客户端使用破坏性更新时强制使用命令式风格。list.sortvs.sorted就是一个例子。

选择是一种风格,因此与周围代码保持一致的通常规则适用。