python 子類中與父類同名屬性的初始化

2021-08-19 16:58:27 字數 3781 閱讀 9083

在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...