在一些教程中,我已经读过__init__
方法,我必须做这样的事情:
class App:
def __init__(self):
...
然而,在PySide中我找到了这个。第QWidget.__init__(self)
行做了什么,我需要做什么?
class App(QWidget):
def __init__(self):
QWidget.__init__(self)
...
答案 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
现在同时具有foo
和bar
两个属性。
你应该很少调用其他类的__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()