如果我有這樣一個類:捕獲許多參數的個數一個在Python __init__
class foo(object):
def __init__(self, a, b=None, c=None, d=None):
print a, b, c, d
和派生類是這樣的:
class bar(foo):
def __init__(self, *args, **kwargs):
if "c" in kwargs:
kwargs['c'] = 'else' # CHANGE C IFF IT IS PRESENT
super(bar, self).__init__(*args, **kwargs)
當有人呼叫此構造,他們可以做它是這樣的:
bar('a','b','c','d')
或者也可以這樣調用它:
bar('a', c='something')
在第二種情況下,我的構造函數按照計劃工作,但在第一次調用c
的情況下,通過參數args數組。這看起來像我不得不觀看args數組的長度以及kwargs,並且這看起來很脆弱以至於無法使用。除了列舉foo中的參數,還有什麼可以改善這種情況嗎? (本身有些脆弱的做法,但更容易識別)。
這個問題的一部分是我仍然需要知道參數的名稱和順序,如果該基類不在您的控制之下,它可能會改變。我可以很容易地枚舉'__init__'中的命名參數以匹配那些基類,然後我不需要zip,但是如果這個順序改變了,(這就是我所說的脆弱性)。 – boatcoder
@ Mark0978,您可以使用'inspect.getargspec(foo .__ init __)。args [1:]'來代替'['a','b','c','d']'。 – falsetru
@ Mark0978,正如JAB回答的那樣,您也可以使用'inspect.getcallargs'。見http://ideone.com/EjD1r8 – falsetru