簡體   English   中英

Python實踐:“引用”傳遞的參數

[英]Python practices: arguments passed by “reference”

考慮一個類的實例:

class Car(object):
    def __init__(self):
        self.engine = None

還有一個修改該實例的函數:

def add_engine(car):
    car.engine = 'V6'

Python沒有隱式技術指出要修改參數。 我能想到的最好的解決方案是返回修改后的對象(即使它將是作為參數傳遞的同一對象):

def add_engine(car):
    car.engine = 'V6'
    return car

您將如何解決這個設計問題?

-

伙計們,非常感謝您的回答。 您的建議有助於清除我的頭緒:)

FWIW,我注意到在Python宇宙中,具有副作用(例如,您要詢問的副作用)的函數/方法總是返回None (這是隱式完成的,可以使用不帶參數的return語句,也可以完全不使用return 。)

例如,將已sorted內置函數(該函數返回一個新列表(當然是已排序))與list.sort方法(該list.sort返回None ,因為在這種情況下,該列表已就位。 內置函數取reversedlist.reverse方法的情況也類似。

因此,僅讓您的函數(隱式)返回None IMO就足以提醒用戶該函數具有副作用的事實(因為沒有副作用,始終返回None的函數基本上是無操作的)以傳統的“ Pythonic”方式。

我傾向於使用這些方法返回self 這允許像

car = Car().add_engine().add_wheels()

有時在Python標准庫中使用的另一個選項是不返回任何內容。 這樣做可以防止混淆,並在客戶端使用破壞性更新時在客戶端強制使用命令式樣式。 list.sortsorted就是一個例子。

選擇是樣式之一,因此適用與周圍代碼保持一致的通常規則。

我將完全不同地解決它:

class Car(object):
    def __init__(self):
        self.engine = None

    def set_engine(self):
        self.engine = 'V6'

慣例是add 追加數據; set更改現有狀態。 正如@larsmans所指出的那樣,汽車的歸還可以提供有吸引力的結構,但根本無法解決您的問題。

Python不像C ++,Java,C#等。您可以做任何您想做的事。 您不能將任何內容設為私有。 您不能強制保持一致性。

Python的這些方面都有其優點和缺點,但這是事實。 由於可以靜態檢查的內容很少,因此您需要對代碼進行非常強大的運行時測試,並且覆蓋范圍廣。 沒有完整覆蓋的強大測試,Python的開發可能會變得像放牧貓。

您可以覆蓋使用__setattr__方法分配的屬性:

class Car(object):
    def __init__(self):
        self.engine = None
    def car_modified(self, name):
        #do whatever you want
    def __setattr__(self, name, value)
        self.__dict__[name] = value
        self.car_modified(name)

現在,每次設置屬性時都會調用car_modified

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM