ava*_*sal 5 python class default-constructor
In [5]: class a(object):
...: def __init__(self):
...: print "In class a"
...: self.a = 1
...:
In [6]: class b(object):
...: def __init__(self):
...: print "In class b"
...: self.b = 2
...:
...:
In [7]: class c(b, a):
...: pass
...:
In [8]: c.mro()
Out[8]:
[<class '__main__.c'>,
<class '__main__.b'>,
<class '__main__.a'>,
<type 'object'>]
In [9]: obj = c()
In class b
In [10]: obj.__dict__
Out[10]: {'b': 2}
Run Code Online (Sandbox Code Playgroud)
__init__
类的默认方法c
在obj
创建时调用,它在内部调用__init__
仅类b
.
根据我的理解,如果我从2类继承,我的派生类对象应该具有来自两个类的变量(除非它们对这些类是私有的).
我的问题:我希望我的派生对象包含两个类的变量我错了吗?如果是这样,为什么?不应该叫__init__
班级a
吗?在像C++这样的语言中会发生什么?
在python中,默认情况下不调用上层的初始化方法.要做到这一点,你必须使用super显式调用它们,如下所示:
class a(object):
def __init__(self):
super(a, self).__init__()
print "In class a"
self.a = 1
class b(object):
def __init__(self):
super(b, self).__init__()
print "In class b"
self.b = 2
class c(b, a):
pass
obj = c()
Run Code Online (Sandbox Code Playgroud)
示例输出.
在班级a
班级b
编辑:关于为什么这样工作,我会说这是基于Python的禅宗的设计决定:
显式优于隐式.
归档时间: |
|
查看次数: |
157 次 |
最近记录: |