python類的繼承和方法重寫總結python
咱們都知道類能夠繼承,經過繼承能夠實現**的復用,使**看起來更加簡潔ide
好比:函式
class b(a):
pass
定義了乙個名為b的類,它繼承於a,咱們把b叫作a的子類,a叫作b的超類(父類)。spa
方法重寫物件
當子類定義了乙個和超類相同名字的方法時,那麼子類的這個方法將覆蓋超類相同的方法(或稱為重寫)繼承
先借用兩個例子:it
>>> class bird:
... def __init__(self):
... self.hungry = true
... def eat(self):
... if self.hungry:
... print 'aaaah...'
... self.hungry = false
... else:
... print 'no,thanks!'
>>> b = bird()
>>> dir(b)
>>> b.eat()
aaaah...
>>> b.eat()
no,thanks!
這個類定義了鳥的基本功能:吃ast
再定義乙個類,songbird是bird的子類,songbird會唱歌class
>>> class songbird(bird):
... def __init__(self):
... self.sound = 'squawk!'
... def sing(self):
... print self.sound
>>> sb = songbird()
>>> sb.sing()
squawk!
>>> sb.eat()
traceback (most recent call last):
file "", line 1, in
file "", line 5, in eat
attributeerror: songbird instance has no attribute 'hungry'
songbird是bird的乙個子類,他繼承了超類的eat方法,但呼叫時卻報錯了,提示沒有hungry屬性,為何會這樣呢?awk
緣由是songbird的構造方法__init__()重寫了,新的構造方法裡沒有任何關於hungry屬性的**。為了達到預期的效果,songbird的構造方法必須呼叫父類的構造方法來確保進行基本的初始化。有兩種方法能達到這個目的:呼叫超類的構造方法的未繫結版本,或者使用super函式。
呼叫超類的構造方法的未繫結版本
>>> class songbird(bird):
... def __init__(self):
... bird.__init__(self)
... self.sound = 'squawk!'
... def sing(self):
... print self.sound
songbird類只新增了一行**bird.__init__(self)
看下執行結果
>>> sb = songbird()
>>> sb.eat()
aaaah...
在呼叫乙個例項的方法時,該方法的self引數會被自動繫結到例項上(這稱為繫結方法),但若是直接呼叫類的方法(好比bird.__init__),就沒有例項被繫結,這樣的方法稱為未繫結方法。
經過將當前的例項做為self引數提供給未繫結方法,songbird類就能使用其超類構造方法的全部實現。
super函式
super函式只能在新式類使用。當前類和物件能夠做為super函式的引數使用,呼叫函式返回的物件的任何方法都是呼叫超類的方法,而不是當前類的方法。
那麼就能夠不用在songbird的構造方法使用bird,而直接使用super(songbird,self)注意是逗號,不是.
除此以外,__init__方法能以一種普通的(繫結)方式被呼叫
>>> __metaclass__ = type
>>> class bird:
... def __init__(self):
... self.hungry = true
... def eat(self):
... if self.hungry:
... print 'aaaah...'
... self.hungry = false
... else:
... print 'no,thanks!'
>>> class songbird(bird):
... def __init__(self):
... super(songbird,self).__init__()
... self.sound = 'squawk!'
... def sing(self):
... print self.sound
>>> sb = songbird()
>>> sb.eat()
aaaah...
>>> sb.eat()
no,thanks!
C 隱藏基類方法和重寫
本質上來說,是隱藏子類中基類的方法,但在子類中仍然可以訪問該功能。示例如下 namespace 隱藏基類和重寫 public class duck animal class program 執行結果為 值得注意的是,若在子類duck中不使用new,可以正常執行,但會生成乙個警告如下,說明隱藏了乙個基...
C 中類的隱藏和重寫的區別
c 的類有隱藏和重寫,兩個的作用其實都是為了實現子類的更改 我是這樣認為了 但之間又有區別,隱藏的方法,只能在子類中實現,而重寫的方法是可以在父類中得以實現.可能這樣說有點玄,舉個例子就可很容易說明 類檔案中如下定義 view plaincopy to clipboardprint?public c...
Python 名稱修飾 隱藏函式 隱藏屬性
python內部會把 字首的屬性重新命名為 類名 屬性名 因此在python中如果乙個屬性不是共有的就約定使用雙下劃線 為字首,它不會呼叫任何名稱修飾的演算法,只是說名這個屬性是該類的私有屬性。class user1 def init self,name,age,address,course,gra...