Python 继承:\uuuu init\uuuuu被覆盖
我有两个类,我希望它们都从另一个类继承。 这两个类已经定义了Python 继承:\uuuu init\uuuuu被覆盖,python,inheritance,Python,Inheritance,我有两个类,我希望它们都从另一个类继承。 这两个类已经定义了def\uuuu init\uuu。现在,我希望这两个类继承一个需要一系列参数(参数)的方法。但是在应该继承的两个类中,def\uu init\uu被覆盖 我怎样才能解决这个问题?我读过Python中的构造函数与def\uu init\uu的比较。我可以为该方法创建一个自定义构造函数吗?总的来说,我在课堂上是个新手 编辑: 这是我正在尝试的。这是一个GUI项目。这是主要课程: class Error: def __init__(
def\uuuu init\uuu
。现在,我希望这两个类继承一个需要一系列参数(参数)的方法。但是在应该继承的两个类中,def\uu init\uu
被覆盖
我怎样才能解决这个问题?我读过Python中的构造函数与def\uu init\uu
的比较。我可以为该方法创建一个自定义构造函数吗?总的来说,我在课堂上是个新手
编辑:
这是我正在尝试的。这是一个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)
问题似乎是您只执行了现有的两个基类
\uuuu init\uuu
方法中的一个,但您希望传递参数并同时调用这两个方法
super
将仅显示方法解析顺序(MRO)中首先出现的方法,因此您必须“手动”调用至少一个\uuuuuuu init\uuuuu
s。您还必须决定派生的\uuuuu init\uuuu
的哪些参数去哪里,因为您必须传入两组参数。在本例中,我将假设错误只接受三个必需的位置参数(check0
、check1
和check2
):
另一方面,我建议您重构代码以使用列表,因为老实说,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]
类错误:
反馈_字符串=[
“您没有提供姓名和/或邮件”,
“您使用了不允许使用的字符:\n/'*\ \ \ \><[]()\+{}%&!\”\“\=?^~,;:”,
“您使用了不允许使用的字符:\n/'*\ \ \ \><[]()\+{}%&!\”\“\=?^~,;:”,
“您没有提供有效的年份(您使用的数字超过4位或没有)”,
“您没有提供有效的年份(您使用了字母)”,
#你明白了。。。
]
定义初始化(自,*检查):
如果len(检查)!=16:
raise VALUERROR('需要16个位置参数')
self.checks=[bool(x)表示检查中的x]
def反馈错误(自身):
对于索引,签入枚举(自检查):
如果没有,请检查:
返回自我反馈字符串[索引]
此代码比现有代码短10倍,易于维护和阅读。我还建议从反馈函数返回一个值,而不是设置一个全局变量。全局变量方法是一个非常糟糕的主意,因为你真的不知道谁会修改它。如果我们要指出你做错了什么,你需要向我们展示你的代码。不清楚
\uuuuuu init\uuuuu
与你的“继承方法”问题有什么关系。。。通常,在设计过程开始时,您决定从基类继承。改变基类几乎肯定意味着重新设计孩子们。它来自一个图书馆。这个设计看起来像一场噩梦。这些“检查”中的每一个都应该立即引发异常,而不是作为参数传递给对象构造函数。@andrew。A) 这悬念快把我累死了。B) 。你认为super…
在做什么?坦率地说,这是一个糟糕的设计。super()
的正确用法如下所示。在一般情况下,一个类不可能知道它后面的所有类的方法解析顺序(至少,在运行时手动内省这些信息是不可能的,这对于一个标准的初始值设定方法来说是非常过分的)。因此,这在一般情况下是行不通的,应该加以劝阻。@Kevin。我完全同意你的意见。然而,这是OP在最直接的字面意义上所要求的。它似乎并没有解决问题。:/谢谢你。顺便问一下,你能解释一下你在feedbackOnError
方法中做了什么吗?不熟悉你是怎么写的。另外,我很感谢你们的评论,因为这对我来说是新的,我正在向你们学习this@andrew. 我将字符串放入一个列表中,然后从检查错误的循环中访问该列表中的相应元素。如果您在列表或循环方面遇到任何问题,我认为在继续之前您确实需要一个基本的Python教程。
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]