Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 继承:\uuuu init\uuuuu被覆盖_Python_Inheritance - Fatal编程技术网

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]