PySide中的__init__方法

时间:2015-07-20 11:41:31

标签: python

在一些教程中,我已经读过__init__方法,我必须做这样的事情:

class App:
    def __init__(self):
    ...

然而,在PySide中我找到了这个。第QWidget.__init__(self)行做了什么,我需要做什么?

class App(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        ...

2 个答案:

答案 0 :(得分:1)

此行调用基类的__init__方法。

class App(QWidget)

App类继承自QWidget类。因此,当您进入App类的实例时,必须调用基类的初始化。在 Python 3 中,您可以使用

执行相同的操作(调用基础__init__
super().__init__()  

在这种情况下

class App

App班级没有基类。

答案 1 :(得分:1)

拨打cls.__init__(self)(其中cls可以是任何课程),只需拨打cls上的__init__ self即可。这是一个例子:

class Foo(object):
    def __init__(self):
        self.foo = True
        print('Initializing object {} on Foo.__init__!'.format(self))

class Bar(object):
    def __init__(self):
        Foo.__init__(self)
        self.bar = True
        print('Initializing object {} on Bar.__init__!'.format(self))

现在创建Bar的实例将同时输出__init__ s:

>>> b = Bar()
Initializing object <__main__.Bar object at 0x00000000039329E8> on Foo.__init__!
Initializing object <__main__.Bar object at 0x00000000039329E8> on Bar.__init__!

此外,b现在同时具有foobar两个属性。

你应该很少调用其他类的__init__,除非你是其他类的子类。上面的示例通常不正确,因为Bar不是子类化Foo

即使你是一个类的子类,也不应该直接使用它的名称访问该类,而是使用Python的内置函数super()

# "WRONG"  (usually)
class X(Y):
    def __init__(self):
        Y.__init__(self)

# RIGHT
class X(Y):
    def __init__(self):
        super().__init__()  # self is omitted when using super()