Python多重继承:类构造和uuu init()方法的参数数量未对齐,导致类型错误

2024-09-24 22:20:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的IronPython项目中,我有一个名为Formbox的类,定义如下:

class Formbox(TextBox, Widget):  

... variables that I treat as static go here ...

def __init__(self, parent, size, position, placeholder_text, formtype=str):
    TextBox.__init__(self)
    Widget.__init__(self, parent, size, position)
    ... rest of the init ...

其中TextBox是.NET系统.Windows.Forms.TextBox类。你知道吗

每当我尝试实例化一个Formbox时,例如:

[例1]

LOAD_TEXTBOX = Formbox(LOAD_AREA, Size(20,20), Point(50,50), "Path to file...")

发生以下情况:

TypeError: Formbox() takes exactly 1 argument (5 given)

如果去掉ex1中传递的所有参数,将参数减少为隐含的self,则会出现以下情况:

TypeError: __init__() takes at least 5 arguments (1 given)

如果有帮助,Widget类如下所示:

class Widget:

    def __init__(self, parent, size, position):
        """

        :type parent:   System.Windows.Forms.Control
        :type size:     System.Drawing.Size
        :type position: System.Drawing.Point
        """
        self.parent = parent
        self.Size = size
        self.Location = position

当然,将继承自的类(Widget或TextBox)减少为一个,会导致Formbox正确实例化。ex1工作得非常好,直到我将Widget添加到超类。你知道吗

我的问题是,为什么这些错误会被扔到我身上,如何解决它,使Formbox类同时继承Widget和TextBox类?你知道吗

p.S.我认为这是我的一个python错误,而不是IronPython的限制

p.p.S为了简洁起见,例1中的大多数论点都被缩短和简化了。


Tags: selfsizeinitwindowsdeftypepositionwidget
1条回答
网友
1楼 · 发布于 2024-09-24 22:20:15

我不能很容易地复制这个,但是我怀疑你遇到了一个混合的情况。下面的代码片段在python2.6.5、2.7.6和2.7.14中运行良好。你知道吗

from __future__ import print_function


class Widget:
    def __init__(self, parent, size, position):
        print('Widget(', self, parent, size, position, ')')


class TextBox(object):  # line: 9
    def __init__(self):
        print('TextBox(', self, ')')


class Formbox(TextBox, Widget):
    def __init__(self, parent, size, position, placeholder_text, formtype=str):
        print('Formbox(', self, parent, size, position, placeholder_text,
              formtype, ')')
        TextBox.__init__(self)
        Widget.__init__(self, parent, size, position)


if __name__ == '__main__':
    f = Formbox('parent', 'size', 'position', 'placeholder')

我怀疑TextBoxobject的一个子类(如第9行所示)。这应该不会引起问题,因为您直接调用初始值设定项,而不是使用super(Formbox, self).__init__(...)。运行此示例将产生以下输出:

Formbox( <__main__.Formbox instance at 0x7f34ded37b90> parent size position placeholder <type 'str'> )
TextBox( <__main__.Formbox instance at 0x7f34ded37b90> )
Widget( <__main__.Formbox instance at 0x7f34ded37b90> parent size position )

Python中的多重继承是非常好的。读一读这个主题的Raymond Hettinger's article。这是如何在Python中使用多重继承的简明说明。你知道吗

在本例中,我怀疑在TextBox中发生了一些改变类创建的事情。你知道吗

相关问题 更多 >