2016-12-23 191 views
0

我有兩個類,我想要從另一個類繼承。 這兩個類已經定義了。現在,我希望這兩個類繼承一個需要一系列參數(參數)的方法。但是在應該繼承的兩個類中,被重寫。繼承:__init__覆蓋

我該如何解決這個問題?我閱讀了Python中的構造函數與。我可以爲該方法創建一個自定義構造函數嗎?一般來說,我在班上很新。

編輯:

這是我正在嘗試。這是一個GUI項目。這是主類:

class Error: 
    def __init__(self, check0, check1, check2, check3, check4, check5, check6, check7, check8, check9, check10, check11, 
        check12, check13, check14, check15): 
     self.check0 = check0 
     self.check1 = check1 
     self.check2 = check2 
     self.check3 = check3 
     self.check4 = check4 
     self.check5 = check5 
     self.check6 = check6 
     self.check7 = check7 
     self.check8 = check8 
     self.check9 = check9 
     self.check10 = check10 
     self.check11 = check11 
     self.check12 = check12 
     self.check13 = check13 
     self.check14 = check14 
     self.check15 = check15 

    def feedbackOnError(self): 
     feedback = '' 
     global feedback 

     if self.check0 == False: 
      feedback0 = "You didn't provide a name and/or mail" 
      feedback = feedback0 

     if self.check3 == False: 
      feedback3 = "You didn't provide a valid year (you used over 4 digits or none)" 
      feedback = feedback3 

     if self.check4 == False: 
      feedback4 = "You didn't provide a valid year (you used letters)" 
      feedback = feedback4 

     if self.check5 == False: 
      feedback5 = "You didn't provide a valid month (you used over 2 digits or none)" 
      feedback = feedback5 

     if self.check6 == False: 
      feedback6 = "You didn't provide a valid month (you used letters)" 
      feedback = feedback6 

     if self.check7 == False: 
      feedback7 = "You didn't provide a valid month (you used a number above 12)" 
      feedback = feedback7 

     if self.check8 == False: 
      feedback8 = "You didn't provide a valid month '00' is not a month)" 
      feedback = feedback8 

     if self.check9 == False: 
      feedback9 = "You didn't provide a valid day (you used letters)" 
      feedback = feedback9 

     if self.check10 == False: 
      feedback10 = "You didn't provide a valid day '00' is not a day)" 
      feedback = feedback10 

     if self.check11 == False: 
      feedback11 = "You didn't provide a valid day (you used a number above 31)" 
      feedback = feedback11 

     if self.check12 == False: 
      feedback12 = "You didn't provide a valid day (you used over 2 digits or none)" 
      feedback = feedback12 

     if self.check13 == False: 
      feedback13 = "Your month doesn't match up with your day (February has 29 during leap year)" 
      feedback = feedback13 

     if self.check14 == False: 
      feedback14 = "Your month doesn't match up with your day (February has 28 during normal years)" 
      feedback = feedback14 

     if self.check15 == False: 
      feedback15 = "Your chosen month and day don't match up (You used '31' for a month with only 30)" 
      feedback = feedback15 

     if self.check1 == False: 
      feedback1 = "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :" 
      feedback = feedback1 

     if self.check2 == False: 
      feedback2 = "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :" 
      feedback = feedback2 

這是我要繼承主類的類:

class AddDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     super(AddDialog, self).__init__(*args, **kwargs) 


class EditDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     super(EditDialog, self).__init__(*args, **kwargs) 
+3

如果我們要指出你做錯了什麼,那麼你需要向我們展示你的代碼。 – user2357112

+0

嘗試在'__init__'方法中調用'super'。 – bjd2385

+1

目前還不清楚'__init__'與你的「繼承方法」問題有關......或者說問題是。 –

回答

0

這個問題似乎是你只執行__init__兩基類的一個你有的方法,但你想傳遞參數並調用它們。

super只會在方法解析順序(MRO)中出現的第一個方法,所以您必須至少調用一個「手動」的__init__。您還必須決定導出的__init__的哪些參數在哪裏,因爲您必須傳入兩組參數。對於這個例子的目的,我會假裝錯誤只需要三個必需的位置參數(check0check1check2):

class AddDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, check0, check1, check2, *args, **kwargs): 
     Error.__init__(self, check0, check1, check2) 
     SizedDialog.__init__(self, *args, **kwargs) 

在一個相關的說明,我會建議你重構你的代碼使用列表因爲說實話,16個論點是荒謬的。使用*args,你能避免重構太多額外的代碼:

class Error: 
    feedback_strings = [ 
     "You didn't provide a name and/or mail", 
     "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :", 
     "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :", 
     "You didn't provide a valid year (you used over 4 digits or none)", 
     "You didn't provide a valid year (you used letters)", 
     # You get the idea... 
    ] 

    def __init__(self, *checks): 
     if len(checks) != 16: 
      raise ValueError('16 positional arguments are required') 
     self.checks = [bool(x) for x in checks] 

    def feedbackOnError(self): 
     for index, check in enumerate(self.checks): 
      if not check: 
       return self.feedback_strings[index] 

此代碼是10倍左右短,維護更方便,更容易比你現有的代碼來讀取。我還建議從您的反饋函數中返回一個值,而不是設置一個全局變量。全球變量方法是一個非常糟糕的主意,因爲你真的不知道誰會修改它。

+0

@andrew。 A)懸念正在殺死我。 B)。你覺得'超級......'在做什麼? –

+0

這是坦率的糟糕設計。 super()的正確用法是[責任鏈](https://rhettinger.wordpress.com/2011/05/26/super-considered-super/)。在一般情況下,類不可能知道所有在方法解析順序中出現的類(至少,在運行時沒有手動反思這些信息,這對於標準初始化方法來說是巨大的矯枉過正)。所以這在一般情況下不起作用,應該不鼓勵。 – Kevin

+0

@凱文。我非常認同你。然而,這是OP在最直接的字面意義上所要求的。 –