2011-11-15 163 views
3
class baseClass(): 
    def __init__(self,mark,name): 
    self.mark = mark 
    self.name = name 

class derivedClass(baseClass): 

b1 = derivedClass(name='Jibin') 
print b1.name 

這是我的代碼最初&它工作正常。派生類的python構造函數

(注:我沒有獲得baseClass

但後來我不得不一個附加屬性rank傳遞給derivedClass。所以我編輯這樣的代碼。

class baseClass(): 
    def __init__(self,mark,name): 
    self.mark = mark 
    self.name = name 

class derivedClass(baseClass): 
    def __init__(self,rank): 
    self.rank = rank 

b1 = derivedClass(name='Jibin') 
print b1.name 

這導致此預期爲derivedClass__init__沒有一個說法name錯誤__init__() got an unexpected keyword argument 'name'

我不想一個額外的參數name在現實baseClass增加的derivedClass b'cos __init__有十個參數,而不是2(標誌,名稱)&如果我給他們都作爲附加參數derivedClass我會凌亂其參數列表。

注:我知道初始化基類的使用baseClass.__init__(self)super(derivedClass, self).__init__()

+4

你的代碼寫得很糟糕。在提交之前,請驗證匿名代碼仍然有效**。 –

+1

[PEP 8](http://www.python.org/dev/peps/pep-0008/)希望您將'baseClass'重命名爲'BaseClass','derivedClass'重命名爲'DerivedClass',並在後面放置空格方法聲明參數中的逗號。 –

+1

目前,派生類與您的基類沒有任何關係。你爲什麼不使用新式課程? – newtover

回答

6

也許你可以嘗試這樣的事情

class BaseClass(object): 
    def __init__(self, mark=None, name=None): # you're using named parameters, declare them as named one. 
    self.mark = mark 
    self.name = name 

class DerivedClass(BaseClass): # don't forget to declare inheritance 
    def __init__(self, rank, *args, **kwargs): # in args, kwargs, there will be all parameters you don't care, but needed for baseClass 
    super(DerivedClass, self).__init__(*args, **kwargs) 
    self.rank = rank 

b1 = derivedClass(name='Jibin') 
print b1.name 
+1

'baseClass'需要是'super'的新樣式才能工作。 –

+0

@BjörnPollex:right,corrected –

+0

Thanks.But它是什麼#''你使用的命名參數,聲明他們爲名爲.'.如果我不給默認值的參數,它不會被命名爲參數? – Jibin

0

This blog介紹如何解決這類問題。解決方法是讓base以及derived在其__init__中接受**kwargs參數,並將其傳遞給super

0

derivedClass不是實際上源自baseClass。在Python中繼承,你必須提供父類的類定義這樣的:

class DerivedClass(BaseClass): 
    pass 

DerivedClass現在繼承BaseClass的,的方法,包括__init__()。如果你不重寫一個方法,那麼在你的子類上調用它實際上會調用超類定義的方法。

所以,如果你想允許DerivedClass(name='Jibin'),您需要提供一個專門的初始化():

class BaseClass(object): 
    def __init__(self, mark, name): 
     self.mark = mark 
     self.name = name 

class DerivedClass(BaseClass): 
    def __init__(self, mark, name, rank): 
     BaseClass.__init__(self, mark, name) 
     self.rank = rank 

現在,你也想明確地支持額外的關鍵字參數來DerivedClass()沒有將它們添加。實現這一目標的一種方法是指定所有kwargs以實例的屬性,即:

class BaseClass(object): 
    def __init__(self, mark, name, **kwargs): 
     self.mark = mark 
     self.name = name 
     self.__dict__.update(kwargs) 

我不「真正的」告知雖然。一味地設置屬性很可能會在今後引進微妙的錯誤(這樣的事情通過將相同名稱的關鍵字ARG不知不覺更換方法)

相關問題