1. __init__ 注意事項
如果父類有__init__函式,子類沒有,則子類自動呼叫父類__init__函式
如果父類有__init__函式,子類也有,則子類必須主動呼叫父類__init__函式,否則會報錯
classa:
def__init__
(self):
self.name = "a"
defprintname(self):
self.name
class
b(a):
def__init__
(self):
a.__init__
(self)
self.
__age = 18obj =b()
obj.printname()
注意1、__init__並不相當於c#中的建構函式,執行它的時候,例項已構造出來了。
1
2
3
4
5
class
a(
object
):
def
__init__(
self
,name):
self
.name
=
name
def
getname(
self
):
return
'a '
+
self
.name
當我們執行
1
a
=
a(
'hello'
)
時,可以理解為
1
2
a
=
object
.__new__(a)
a.__init__(a,
'hello'
)
即__init__作用是初始化已例項化後的物件。
注意2、子類可以不重寫__init__,例項化子類時,會自動呼叫超類中已定義的__init__
1
2
3
4
5
6
7
class
b(a):
def
getname(
self
):
return
'b '
+
self
.name
if
__name__
=
=
'__main__'
:
b
=
b(
'hello'
)
print
b.getname()
但如果重寫了__init__,例項化子類時,則不會隱式的再去呼叫超類中已定義的__init__
1
2
3
4
5
6
7
8
9
class
c(a):
def
__init__(
self
):
pass
def
getname(
self
):
return
'c '
+
self
.name
if
__name__
=
=
'__main__'
:
c
=
c()
print
c.getname()
則會報"attributeerror: 'c' object has no attribute 'name'」錯誤,所以如果重寫了__init__,為了能使用或擴充套件超類中的行為,最好顯式的呼叫超類的__init__方法1
2
3
4
5
6
7
8
9
class
c(a):
def
__init__(
self
,name):
super
(c,
self
).__init__(name)
def
getname(
self
):
return
'c '
+
self
.name
if
__name__
=
=
'__main__'
:
c
=
c(
'hello'
)
print
c.getname()
2.繼承有普通繼承和super繼承兩種
3.python類有新式類和經典類
區別:
1)首先,寫法不一樣:
class a:
pass
class b(object): pass
2)在多繼承中,新式類採用廣度優先搜尋,而舊式類是採用深度優先搜尋。
3)新式類更符合oop程式設計思想,統一了python中的型別機制。
4)舊類無法使用super
5)新類的型別是type
Java繼承注意事項
錯誤寫法 class computer1 class computer2 如果想同時繼承兩個父類怎麼辦呢?class computer1 class computer2 extends computer1 class pad extends computer2 class computer1 cla...
python 注意事項
from functools import reducereduce 函式會對引數序列中元素進行累積。函式將乙個資料集合 鍊錶,元組等 中的所有資料進行下列操作 用傳給 reduce 中的函式 function 有兩個引數 先對集合中的第 1 2 個元素進行操作,得到的結果再與第三個資料用 func...
python注意事項
編寫python的注意事項 表示式與基本語句的不同 結果相同但複雜的表示式系統可能會提示出錯 如22為表示式 print 22 為語句 字元縮排 python有乙個特點,就是具有強制縮排的功能,而強制縮排一般我們採用tab鍵,如果在編寫過程中採用tab和空格鍵並用,系統極有可能會出錯 注釋 注釋是為...