我的目標是爲幾個對象屬性設置可變類型(列表)的默認值。根據here的討論,我在__init__
的參數中將這些屬性的默認值設置爲None
,然後如果他們採用默認值,則將它們的值分配給[]
,其值爲__init__
。這裏有這樣的代表:對象屬性的可變類型默認值的迭代賦值
class Wat(object):
def __init__(self, arg1=None, arg2=None, arg3=None):
for arg in arg1, arg2, arg3:
if arg == None:
arg = []
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def give(self, thing):
self.arg1.append(thing)
self.arg2.append(thing)
self.arg3.append(thing)
wat = Wat()
wat.give(5)
但是,這將引發以下異常:
AttributeError: 'NoneType' object has no attribute 'append'
。
我看不出wat.arg1
,wat.arg2
和wat.arg3
仍然可以在時間wat.give(5)
型None
被稱爲 - 他們應該在__init__
被派到[]
。它必須是與我所編碼的分配方式,因爲這個工程:
class Wat(object):
def __init__(self, arg1=None, arg2=None, arg3=None):
if arg1 == None:
arg1 = []
if arg2 == None:
arg2 = []
if arg3 == None:
arg3 = []
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def give(self, thing):
self.arg1.append(thing)
self.arg2.append(thing)
self.arg3.append(thing)
wat = Wat()
wat.give(5)
在我看來,這兩個語法相同的功能,但你能想象後者語法如何變得非常繁瑣,不美觀因爲以這種方式分配的參數數量增加。
以前的語法有什麼問題?我該如何解決它?謝謝。
編輯:你們幾個已經確定了這個問題,但我仍然沒有一個令人滿意的解決方案。 @roippi提出了一種有效的方法來分配一個變量,但假設我有100個變量。我如何在最少的代碼行中完成這項任務?這是循環的最初目的。謝謝你們。
你可以只做'self.arg1 = arg1如果arg1 else []'等等。跳過那個中間步驟。 – roippi
@roippi,考慮'如果arg1是None else []',否則條件不一樣。 –
@kroolik如果你的類已經定義了多個falsy值的行爲,當然。否則,我認爲這種區別毫無意義。 – roippi