[英]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
,因為在這種情況下,該列表已就位。 內置函數取reversed
和list.reverse
方法的情況也類似。
因此,僅讓您的函數(隱式)返回None
IMO就足以提醒用戶該函數具有副作用的事實(因為沒有副作用,始終返回None
的函數基本上是無操作的)以傳統的“ Pythonic”方式。
我傾向於使用這些方法返回self
。 這允許像
car = Car().add_engine().add_wheels()
有時在Python標准庫中使用的另一個選項是不返回任何內容。 這樣做可以防止混淆,並在客戶端使用破壞性更新時在客戶端強制使用命令式樣式。 list.sort
與sorted
就是一個例子。
選擇是樣式之一,因此適用與周圍代碼保持一致的通常規則。
我將完全不同地解決它:
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.