python類的屬性或方法的訪問權限及__call__方法

python類的屬性或方法的訪問權限及__call__方法

https://baijiahao.baidu.com/s?id=1667648572194870594&wfr=spider&for=pc

類屬性或方法的訪問權限

python中,實例化了一個類的對象後,可以通過該對象,訪問類中的屬性或方法。如下:

類屬性或方法調用

當我們存在一些屬性或方法,只希望在類內部被使用,而不希望從外部使用時,可以通過__(雙下劃線)開頭的形式來制定標識符。這樣定義的屬性或方法,是不能從外部訪問的,否則會報AttributeError,屬性錯誤。如下:

不合法的調用方式

在某些語言中,可能會用到private,public等類似的關鍵字,來達到屬性或方法的訪問權限限制,但是,在python中,採用了雙下劃線開頭的方式。

類的專有方法

在學習運算符時,我們發現有些運算符,如 + 號,可用應用於數字,字符串,列表等。那麼,它是否可以應用於我們自定義的類呢?

答案是可以的。python規定了一系列專有方法,當你希望你自定義的類支持某個運行符時,你需要在類中添加它們。如 + 號:

加號

如果沒有定義__add__方法,就嘗試使用 + 號,會報TypeError,類型錯誤。

同樣的,還有下面這些:

__init__ : 構造函數,在生成對象時調用__del__ : 析構函數,釋放對象時使用__repr__ : 打印,轉換__setitem__ : 按照索引賦值__getitem__: 按照索引獲取值__len__: 獲得長度__cmp__: 比較運算__call__: 函數調用__sub__: 減運算__mul__: 乘運算__truediv__: 除運算__mod__: 求餘運算__pow__: 乘方運算對上面一些可能有疑惑的方法進行一個說明。比如說:

__repr__會在你嘗試打印或轉換對象時使用,比如說你嘗試通過 print函數將對象test1打印出來,就會調用__repr__,打印的內容即是__repr__方法的返回值。如下:

打印

當你嘗試通過索引操作對象時,會調用__getitem__或__setitem__,當嘗試通過len函數操作對象時,會調用__len__。如下:

索引和長度

當你希望通過比較運算符對對象進行比較時,你需要提供__cmp__方法。在python3的最新版本中,__cmp__方法被移除了,新增了一系列方法,如__eq__用於判斷是否相等,__ne__用於判斷是否不等,__gt__用於判斷是否大於,__lt__用於判斷是否小於,__ge__用於判斷是否大於等於,__le__用於判斷是否小於等於。有趣的是,python比想象的要聰明些。當你提供了__eq__方法,即使不提供__ne__方法,也可以使用 != 。當你提供了__gt__,就可以使用 > 或 <。當你提供了__le__,就可以使用 >= 或 <=。如下:

比較

需要注意的是,當你嘗試使用sorted函數,對某個自定義對象組成的序列進行排序時,必須提供__gt__或__lt__二者之一。否則會報TypeError,類型錯誤。

__call__方法,可以幫助你把對象當成一個函數來使用。如下:

對象變函數

如上,test1是一個對象,但是在第8行,卻能當成一個函數來使用。當然,如果沒有提供__call__方法,會報TypeError,類型錯誤。

當然了,除非一些特殊的場景,一般情況下,這種用法,我們依然是不推薦的。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章