python 繼承時注意事項

2021-09-07 05:06:18 字數 4275 閱讀 3254

1. __init__ 注意事項

如果父類有__init__函式,子類沒有,則子類自動呼叫父類__init__函式

如果父類有__init__函式,子類也有,則子類必須主動呼叫父類__init__函式,否則會報錯

class

a:

def__init__

(self):

self.name = "a"

defprintname(self):

print

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

classa(object):

def__init__(self,name):

self.name=name

defgetname(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

classb(a):

defgetname(self):

return'b '+self.name

if__name__=='__main__':

b=b('hello')

printb.getname()

但如果重寫了__init__,例項化子類時,則不會隱式的再去呼叫超類中已定義的__init__

1

2

3

4

5

6

7

8

9

classc(a):

def__init__(self):

pass

defgetname(self):

return'c '+self.name

if__name__=='__main__':

c=c()

printc.getname()

則會報"attributeerror: 'c' object has no attribute 'name'」錯誤,所以如果重寫了__init__,為了能使用或擴充套件超類中的行為,最好顯式的呼叫超類的__init__方法1

2

3

4

5

6

7

8

9

classc(a):

def__init__(self,name):

super(c,self).__init__(name)

defgetname(self):

return'c '+self.name

if__name__=='__main__':

c=c('hello')

printc.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和空格鍵並用,系統極有可能會出錯 注釋 注釋是為...