2016-12-23 285 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在最直接的字面意义上所要求的。 –