python隱藏類的屬性 重寫 dir

2021-10-19 22:17:08 字數 2802 閱讀 6105

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