父類 子類
class a:
para1=
"para"
def __init__
(self,name,name1)
: self.name=name
self.name1=name1
def function1
(self)
:print
("function1"
) def functon2
(self)
:print
("function2"
) def function3
(self)
:print
(self.para1)
def function4
(self)
:print
(self.name1)
class b
(a):
def __init__
(self,name)
: self.name=name
def functionb1
(self)
:print
(self.name)
def functionb2
(self)
:print
(self.para1)
def functionb3
(self)
:print
(self.name1)#該句應該出錯,因為子類已經重寫了初始化,所以不會呼叫父類的self.name1
class c
(a):
def __init__
(self,name)
: self.name=name
a.__init__
(self,
"ac1"
,"a2c"
) def function1
(self)
:print
(self.name)#重寫了function1,所以這裡應該列印的c類自己的初始化引數值self.name
def functionc1
(self)
:print
(self.name1)#相對functionb3這裡不會報錯,因為初始化裡面也把a類的初始化加進來了
執行:
action=a(
"a1"
,"a2"
)action1=b(
"b1"
)action2=c(
"c1"
)action.
function1()
action.
function3()
action1.
functionb1()
action1.
functionb3()
action2.
function1()
action2.
functionc1
()
執行結果和預期一樣:
d:\auto\python3.
8\python.exe d:
/auto/webauto_pythonv2.
3_20200323/testtmp/tmp.py
traceback (most recent call last)
: file "d:/auto/webauto_pythonv2.3_20200323/testtmp/tmp.py"
, line 50,in
action1.
functionb3()
function1
file "d:/auto/webauto_pythonv2.3_20200323/testtmp/tmp.py"
, line 33
,in functionb3
para
b1 print
(self.name1)#該句應該出錯,因為子類已經重寫了初始化,所以不會呼叫父類的self.name1
attributeerror:
'b' object has no attribute 'name1'
action=a(
"a1"
,"a2"
)action1=b(
"b1"
)action2=c(
"c1"
)action.
function1()
action.
function3()
action1.
functionb1()
#action1.
functionb3()
action2.
function1()
action2.
functionc1
()
執行結果:
function1
para
b1ac1
a2c修改**:
class c
(a):
def __init__
(self,name)
: a.
__init__
(self,
"ac1"
,"a2c"
) self.name=name
def function1
(self)
:print
(self.name)#重寫了function1,所以這裡應該列印的c類自己的初始化引數值self.name
def functionc1
(self)
:print
(self.name1)#相對functionb3這裡不會報錯,因為初始化裡面也把a類的初始化加進來了
執行結果:
d:\auto\python3.
8\python.exe d:
/auto/webauto_pythonv2.
3_20200323/testtmp/tmp.py
function1
para
b1c1
a2c```clike
****這裡發現action2.function1和action2.functionc1取的值是父類的,也就是說如果子類同時重寫自己的初始化的時候同時也呼叫了父類的初始化,此時同名字的值則以**的先後順序決定,最後出現的哪個引數的值作為最終值,所以建議如果不是為了覆蓋引數引數名字要不同 繼承類的初始化
執行時,先訪問main函式。載入器開始啟動並找出該類的編譯 載入時,由於extends知道有乙個基類,於是載入基類。如果基類仍舊有基類,那麼再載入。直到所有的基類載入完畢。很重要的一點是static方法是在載入類的時候就被執行了,而static域也在此時也會在此時進行初始化。所有的類載入完畢。開始建...
類的初始化和例項的初始化
有如下兩個類 father 父類 package com.yzx.test01 父類物件 父類初始化 1 j method 5 2 父類的靜態 塊 1 父類的例項化方法 1 super 最前 2 i test 3 父類的非靜態 塊 4 父類的無參構造 最後 非靜態方法前面其實有乙個預設物件this ...
類的初始化和例項的初始化
執行結果 一 初始main方法所在的類,有父類先初始化父類,初始屬性和構造方法,執行順序與 順序一致 5 1 10 6 二 物件son初始化 1 呼叫super 載入父類f非靜態的物件,屬性與 塊按順序,構造器最後執行,順序如下 i test 實際執行子類重寫的物件 9 呼叫父類非靜態 塊 3 載入...