1. 程式人生 > >孤荷凌寒自學python第二十四天python類中隱藏的私有方法探祕

孤荷凌寒自學python第二十四天python類中隱藏的私有方法探祕

孤荷凌寒自學python第二十四天python類中隱藏的私有方法探祕

 

(完整學習過程螢幕記錄視訊地址在文末,手寫筆記在文末)

今天發現了python的類中隱藏著一些特殊的私有方法。

這些私有方法不管我們定義類時是否在類的內部程式碼塊中定義過它們,這些私有方法都是存在的。比如已經知道的 __init__ 方法就是其中一個。

一、__str__

此方法將輸出在本身的相關資訊文字。

測試:

class ghlh(object):

    name='孤荷凌寒'

    qq='578652607'

 

newghlh=ghlh()

strTemp=newghlh.__str__()

print(strTemp)

執行結果 :

<__main__.ghlh object at 0x000002030E274CC0>

當然同 __init__ 方法一樣,我們可以自己重新覆蓋 書寫 此方法的程式碼:

class ghlh(object):

    name='孤荷凌寒'

    qq='578652607'

 

    def __str__(self):

        return self.name

 

newghlh=ghlh()

strTemp=newghlh.__str__()

print(strTemp)

現在的執行結果:

孤荷凌寒

 

二、__iter__

通過類的此方法,可以使一個類的例項化物件變成一個迭代器。

但是此方法必須配合顯式定義過的:

__next__

方法同時使用才有實際功用。

測試如下:

class ghlh(object):

    name='孤荷凌寒'

    qq='578652607'

    a=0

    b=1

 

    def __str__(self):

        return self.name

 

    def __init__(self,a=0,b=1):

        self.a=a

        self.b=b

 

    def __iter__(self):

        return self #通過此語句,使類的例項化物件成為一個迭代器,可以在被 迴圈語句 讀取時,每次返回自身中 __next__ 方法的下一物件值

 

    def __next__(self):

        self.a,self.b=self.b,self.a+self.b #每次被訪問本迭代器時,都返回當前a,b的下一個值,b=上一個a+上一個b

        if self.a>10000: #加個條件,使本 迭代器 成為一個有限元素的 迭代器,否則將無窮下去。

            raise StopIteration #當達到條件時,通過raise返回一個迭代元素結束的錯誤來使本 迭代器 的元素是有限的。

        return self.a  #每次被 訪問 本迭代器時,將a的值返回給呼叫的 迴圈語句

 

newghlh=ghlh()

#strTemp=newghlh.__str__()

#print(strTemp)

 

#因為我們已經在類中定義了 __iter__ 方法 和 __next__ 方法,現在類的例項化物件 newghlh 已經成為了一個迭代器,可以在迴圈體中直接使用了。

for n in newghlh:

    print(n)

執行結果 :

1

1

2

3

5

8

13

21

34

55

89

144

233

377

610

987

1597

2584

4181

6765

 

三、 __getitem__

通過顯式地編寫好此私有方法的程式碼,可以實現將類例項化後的物件當作列表來使用的效果。

測試:

class ghlh(object):

    name='孤荷凌寒'

    qq='578652607'

    a=0

    b=1

 

    def __str__(self):

        return self.name

 

    def __init__(self,a=0,b=1):

        self.a=a

        self.b=b

 

    def __iter__(self):

        return self #通過此語句,使類的例項化物件成為一個迭代器,可以在被 迴圈語句 讀取時,每次返回自身中 __next__ 方法的下物件值

 

    def __next__(self):

        self.a,self.b=self.b,self.a+self.b #每次被訪問本迭代器時,都返回當前a,b的下一個值,b=上一個a+上一個b

        if self.a>10000: #加個條件,使本 迭代器 成為一個有限元素的 迭代器,否則將無窮下去。

            raise StopIteration #當達到條件時,通過raise返回一個迭代元素結束的錯誤來使本 迭代器 的元素是有限的。

        return self.a  #每次被 訪問 本迭代器時,將a的值返回給呼叫的 迴圈語句

 

    def __getitem__(self,n):

        for x in range(n):   #將a的值變化 n 次(最大次數),然後就相當於建立 了一個 內部元素 總數為 n 個的列表

            self.a,self.b=self.b,self.a+self.b

        return self.a

 

newghlh=ghlh()

#strTemp=newghlh.__str__()

#print(strTemp)

 

#因為我們已經在類中定義了 __iter__ 方法 和 __next__ 方法,現在類的例項化物件 newghlh 已經成為了一個迭代器,可以在迴圈體中直接使用了。

#for n in newghlh:

#    print(n)

 

intNew=newghlh[3] #現在對於 ghlh 類例項化的 物件 newghlh 可以像使用 列表一樣訪問其元素了。

print(intNew)

執行結果 :

2

 

四、__getattr__

通過此內部方法來獲取類例項化後的物件中的物件時,就算要獲取 的物件根本不存在,也不會丟擲錯誤。

 

五、__call__

通過顯式地編寫此私有方法的程式碼,主要是給此方法函式新增形式引數(也可以不新增形式引數),並讓函式內部程式碼塊執行一定的操作。

那麼只要在類的內部程式碼塊中顯式地重定義了此方法函式,就可以將 此 類 例項化後的物件名 當作一個函式名稱來使用,當呼叫這個“函式”時,實則上是執行了類程式碼中的私有方法:

__call__

測試:

class ghlh(object):

    name='孤荷凌寒'

    qq='578652607'

    a=0

    b=1

 

    def __str__(self):

        return self.name

 

    def __init__(self,a=0,b=1):

        self.a=a

        self.b=b

 

    def __iter__(self):

        return self #通過此語句,使類的例項化物件成為一個迭代器,可以在被 迴圈語句 讀取時,每次返回自身中 __next__ 方法的下物件值

 

    def __next__(self):

        self.a,self.b=self.b,self.a+self.b #每次被訪問本迭代器時,都返回當前a,b的下一個值,b=上一個a+上一個b

        if self.a>10000: #加個條件,使本 迭代器 成為一個有限元素的 迭代器,否則將無窮下去。

            raise StopIteration #當達到條件時,通過raise返回一個迭代元素結束的錯誤來使本 迭代器 的元素是有限的。

        return self.a  #每次被 訪問 本迭代器時,將a的值返回給呼叫的 迴圈語句

 

    def __getitem__(self,n):

        for x in range(n):   #將a的值變化 n 次(最大次數),然後就相當於建立 了一個 內部元素 總數為 n 個的列表

            self.a,self.b=self.b,self.a+self.b

        return self.a

 

    def __call__(self,strMsg):

        print('這是在類內部程式碼塊中宣告的一個方法:收到的形式引數對應的實參的值是:“' + strMsg + '”')

 

newghlh=ghlh()

#strTemp=newghlh.__str__()

#print(strTemp)

 

#因為我們已經在類中定義了 __iter__ 方法 和 __next__ 方法,現在類的例項化物件 newghlh 已經成為了一個迭代器,可以在迴圈體中直接使用了。

#for n in newghlh:

#    print(n)

 

#intNew=newghlh[3] #現在對於 ghlh 類例項化的 物件 newghlh 可以像使用 列表一樣訪問其元素了。

#print(intNew)

 

newghlh('將類的例項化後的物件當作了函式來使用,這是傳遞的實際引數') #現在可以像呼叫函式一樣呼叫這個類的例項化物件名稱

執行結果:

這是在類內部程式碼塊中宣告的一個方法:收到的形式引數對應的實參的值是:“將類的例項化後的物件當作了函式來使用,這是傳遞的實際引數”

 

 

——————————

今天整理的學習筆記完成,最後例行說明下我的自學思路:

根據過去多年我自學各種程式語言的經歷,認為只有真正體驗式,解決實際問題式的學習才會有真正的效果,即讓學習實際發生。在2004年的時候我開始在一個鄉村小學自學電腦 並學習vb6程式語言,沒有學習同伴,也沒有高師在上,甚至電腦都是孤島(鄉村那時還沒有網路),有的只是一本舊書,在痛苦的自學摸索中,我找到適應自己零基礎的學習方法:首先是每讀書的一小節就作相應的手寫筆記,第二步就是上機測試每一個筆記內容是否實現,其中會發現書中講的其實有出入或錯誤,第三步就是在上機測試之後,將筆記改為電子版,形成最終的修訂好的正確無誤的學習筆記 。

通過反覆嘗試錯誤,在那個沒有分享與交流的黑暗時期我摸黑學會了VB6,爾後接觸了其它語言,也曾聽過付費視訊課程,結果發現也許自己學歷果然太低,就算是零基礎的入門課程,其實也難以跟上進度,講師的教學多數出現對初學者的實際情況並不瞭解的情況,況且學習者的個體也存在差異呢?當然更可怕的是收費課程的價格往往是自己難以承受的。

於是我的所有程式設計學習都改為了自學,繼續自己的三步學習筆記法的學習之路。

當然自學的最大問題是會走那麼多的彎路,沒有導師直接輸入式的教學來得直接,好在網路給我們帶來無限搜尋的機會,大家在網路上的學習日誌帶給我們共享交流的機會,而QQ群等交流平臺、網路社群的成立,我們可以一起自學,互相批評交流,也可以獲得更有效,更自主的自學成果。

於是我以人生已過半的年齡,決定繼續我的程式設計自學之路,開始學習python,只希望與大家共同交流,一個人的獨行是可怕的,只有一群人的共同前進才是有希望的。

誠摯期待您的交流分享批評指點!歡迎聯絡我加入從零開始的自學聯盟。

這個時代網際網路成為了一種基礎設施的存在,於是本來在孤獨學習之路上的我們變得不再孤獨,因為網路就是一個新的客廳,我們時刻都可以進行沙龍活動。

非常樂意能與大家一起交流自己自學心得和發現,更希望大家能夠對我學習過程中的錯誤給予指點——是的,這樣我就能有許多免費的高師了——這也是分享時代,社群時代帶來的好福利,我相信大家會的,是吧!

 

根據完全共享的精神,開源互助的理念,我的個人自學錄製過程是全部按4K高清視訊錄製的,從手寫筆記到驗證手寫筆記的上機操作過程全程錄製,但因為4K高清檔案太大均超過5G以上,所以無法上傳至網路,如有需要可聯絡我QQ578652607對傳,樂意分享。上傳分享到百度網盤的只是壓縮後的720P的視訊。

 

我的學習過程錄影百度盤地址分享如下:(清晰度:1280x720)

連結:https://pan.baidu.com/s/1p_0uK4C8MBN-p6vtIBXPUQ  密碼:p1z1

 

Bilibili:

https://www.bilibili.com/video/av36211518/

 

喜馬拉雅語音筆記:

https://www.ximalaya.com/keji/19103006/140981786