在python繼承中,子類的init()方法中需要初始化父類的屬性,常常會用到super(child, self).init(arg1, arg2)這樣的方法。
下面思考一下如下幾個問題:
1.如果在子類的建構函式中需要初始化父類的屬性,一般需要使用super,是否可以使用同名的屬性來進行初始化。
看幾個例子:
使用self.value複製的方式:
class
p(object):
def__init__
(self):
self.value = 0
print
"++++++"
print id(self.value)
defget(self):
print
"p get"
print self.value
return id(self.value)
class
c(p):
def__init__
(self):
print
"start"
self.value = 44
#兩句交換一下位置看看
#super(c, self).__init__() #標準的寫法是這樣的, 先呼叫父類建構函式
print id(self.value)
print
"*****=="
print id(self.value)
defget(self):
print
"c get"
print self.value
return id(self.value)
defgetsuper
(self):
return super(c, self).get()
c = c()
print c.get()
print
"----------"
print c.getsuper()
輸出結果:
➜ ~ python object.py
start
19263528
*****==
19263528
c get
4419263528
----------
p get
4419263528
分析結果:
從結果可以看到,父類和子類的同名成員是同乙個id。
使用super方式,修改一下**:
class
p(object):
def__init__
(self):
self.value = 0
print
"++++++"
print id(self.value)
defget(self):
print
"p get"
print self.value
return id(self.value)
class
c(p):
def__init__
(self):
print
"start"
#self.value = 44 #兩句交換一下位置看看
super(c, self).__init__() #標準的寫法是這樣的, 先呼叫父類建構函式
print id(self.value)
print
"*****=="
print id(self.value)
defget(self):
print
"c get"
print self.value
return id(self.value)
defgetsuper
(self):
return super(c, self).get()
c = c()
print c.get()
print
"----------"
print c.getsuper()
輸出結果:
➜ ~ python object.py
start
++++++
22908032
22908032
*****==
22908032
c get
022908032
----------
p get
022908032
分析結果:
如果使用super來初始化父類屬性,可以看到,結果是一樣的。
如果有兩個初始化的操作
class
p(object):
def__init__
(self):
self.value = 0
print
"++++++"
print id(self.value)
defget(self):
print
"p get"
print self.value
return id(self.value)
class
c(p):
def__init__
(self):
super(c, self).__init__() #標準的寫法是這樣的, 先呼叫父類建構函式
print
"start"
self.value = 44
#兩句交換一下位置看看
print id(self.value)
print
"*****=="
print id(self.value)
defget(self):
print
"c get"
print self.value
return id(self.value)
defgetsuper
(self):
return super(c, self).get()
c = c()
print c.get()
print
"----------"
print c.getsuper()
輸出結果:
➜ ~ python object.py
++++++
10316928
start
10317864
*****==
10317864
c get
4410317864
----------
p get
4410317864
分析結果:
可以看出來結果有些不同,這是因為後乙個初始化方法會覆蓋前乙個初始化方法。即self.value會覆蓋super(c, self)._init_(),所以會有兩個id,但是get方法得到的都是id,都是後面乙個value的id。
2.為什麼一般都是用super這種方式來初始化父類的屬性,而不用self.value = ***這種方式。
該例子中是因為父類的屬性並不是特別多,所以並沒有什麼影響,如果子類需要繼承的父類屬性較多,可能就會比較麻煩,所以我們一般使用super來初始化父類屬性。
子類函式對父類同名函式的覆蓋
先看一道題 class b void f double const class d public b int main 答案 3個呼叫全部呼叫子類的f void 但由於後兩個不能轉換為void 編譯出錯。void 是可以指向任何型別的指標。c 中,只有int 0可以轉換為指標型,其餘均不可以,所以出...
C 子類函式對父類同名函式的覆蓋
class b public void f int const cout b.int endl void f double const cout b.double endl class d public b public void f void const cout d.void endl int ...
C 子類和父類同名成員變數或函式
在c 中子類和父類同名成員時候c 版本不同處理的方式也不同。下面是我使用visual c 2015 update 3的測試結果 測試 如下 include using namespace std class base virtual void print base class public base...