我想自動解包初始化變量一勞永逸。我的思考過程是解壓所有,並使用setattr作爲屬性名稱作爲變量的名稱。如何在python類的init中自動設置自我屬性?
class BaseObject(object):
def __init__(self, *args):
for arg in args:
setattr(self, argname, arg)
class Sub(BaseObject):
def __init__(self, argone, argtwo, argthree, argfour):
super(Sub, self).__init__(args*)
那麼你應該能夠做到:
In [3]: mysubclass = Sub('hi', 'stack', 'overflow', 'peeps')
In [4]: mysubclass.argtwo
Out[4]: 'stack'
基於帕拉姆的 '堆' 已被命名爲argtwo
。
這樣就可以自動獲得,但你仍然可以覆蓋象下面這樣:
class Sub(BaseObject):
def __init__(self, argone, argtwo, argthree, argfour):
super(Sub, self).__init__(arglist)
clean_arg_three = process_arg_somehow(argthree)
self.argthree = clean_arg_three
顯然我卡在如何傳遞參數(argone,argtwo等)的實際名稱爲一個字符串setattr
,以及如何正確地傳遞ARGS到super init
(該args
super(Sub, self).__init__(args*)
的)
謝謝
那是冷血的,沒想到它會變得更好。我會盡量不要如此快速地選擇答案 – codyc4321
你怎麼知道使用那部分堆棧?你只需使用ipdb並檢查inspect.stack()? – codyc4321
幾個月前,我編寫了一個函數來將新變量轉儲到調用者的名稱空間中,我想到了這一點。我想我是通過https://docs.python.org/2/library/inspect.html上的文檔提示進行了試驗和錯誤。最有用的信息是:(1)「[stack()返回]調用者堆棧的幀記錄列表。返回列表中的第一個條目表示調用者;最後一個條目表示堆棧中最外面的調用。因此stack()[1]。(2)「當[stack()返回]'幀記錄時,'每個記錄是一個包含六個元素的元組:幀對象,...」。因此stack()[1] [0]。 –