python類相關函數和內置屬性、魔術方法、property裝飾器

與類有關的幾個函數

1、getattrr():獲取對象的屬性和方法

getattr有三個參數:getattr(對象名或類名,屬性,‘default’)
最后一個default是默認值,也就是某個類或者某個對象沒有你要獲取的屬性或者方法時,返回default

2、setattrr():設置一個不存在的屬性

setattr(對象名或類名,屬性名,設置的值)
使用setattr時有兩種情況:
第一種就是原本對象或者類內并沒有這個屬性,我可以通過setattr來進行添加并賦值
第二種就是,假如某對象或者類內已經存在某屬性,再用setattr進行操作的話就相當于對該屬性值進行修改

3、hasattrr():判斷對象有沒有某屬性或者方法,返回布爾值

hasattr(對象或類名,要檢查的屬性名或方法名)

4、delattrr():刪除屬性

類屬性只能通過類名來刪

5、isinstancer():檢查是不是這個對象產生的實例,返回布爾值
6、issubclassr():檢查一個類是否是另一個類的子類,返回布爾值
7、dir() : 獲取對象的成員列表

die(類)和dir(實例對象)輸出一致

8、property() ------使用在類的內部處理set和get方法

property() 函數的作用是在新式類中返回屬性值。
class property([fget[, fset[, fdel[, doc]]]])

  • fget -- 獲取屬性值的函數
  • fset -- 設置屬性值的函數
  • fdel -- 刪除屬性值函數
  • doc -- 屬性描述信息

對應實現了自己的get_attr 和set_attr或del_attr方法的屬性, 如果想要替換成新式類的用法, 而不影響之前類的調用邏輯, 可以使用property綁定其get,set,del方法, 從而在正常的 點(.)訪問和修改操作時能夠正常映射到這些方法。

#使用property綁定fee 的get_fee和set_fee方法
fee = property(get_fee, set_fee)

除了使用property將get, Set方法映射到對屬性的訪問上, python還推薦使用@property來處理get和set方法。

class Student():
    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    @property
    def age(self):
        print('reading age')
        return self.__age

    @age.setter
    def age(self, age):
        print('setting age')
        self.__age = age

    @age.deleter
    def age(self):
        print('deleting age')
        del self.__age

類內置屬性

1、__name__ 文檔,也就是獲取類的名稱
2、__doc__ 文檔,也就是獲取類的注釋文檔

注意它只返回第一個三對單引號或三對雙引號的類的注釋文檔。

3、__dict__

dict是用來存儲對象屬性的一個字典,其鍵為屬性名,值為屬性的值。
許多內建類型就沒有__dict__屬性,如list,此時就需要用dir()來列出對象的所有屬性。

  • 類的dict存儲所有實例共享的變量和函數(類屬性,方法等),類的dict并不包含其父類的屬性。
  • 實例的dict僅存儲與該實例相關的實例屬性('不包含類屬性'),正是因為實例的dict屬性,每個實例的實例屬性才會互不影響。
4、__bases__

可知道這個類的父類是誰


類魔術方法

一、操作相關

1、__init__ () 初始化函數(構造函數)

Python的類中可以有很多個構造函數,但是最后一個構造函數會覆蓋掉上面的構造函數,所以,只有最后一個init函數有效, 可以通過定義類方法實現多個構造方法的技巧。

2、__call__() 對象當函數使用時觸發(fā)

實例化對象()自動調用類中的__call__方法

圖片.png

第一個參數為當前類對象self

def __call__(self, *args, **kwargs):
    ...
3、__str__ ()__repr__()

__str__ ()在對象當字符串使用時觸發(fā),返回一個很好地向人描述對象的字符串。
__repr__()在對象當字符串使用時觸發(fā),返回供解釋器讀取的字符串,一般是返回類名。
使用str()或repr()方法來解析對象時, 就會觸發(fā)對象的strrepr方法。

如果實現了repr而沒有定義str,那么對象將會表現出str = repr

4、__new__()--重要

特性:

  • __new__ 方法是在類準備將自身實例化時調用。
  • __new__方法始終都是類的靜態(tài)方法,即使沒有被加上靜態(tài)方法裝飾器

在定義新式類時沒有重新定義new()時,Python默認是調用該類的直接父類的new()方法來構造該類的實例,如果該類的父類也沒有重寫new(),那么將一直按此規(guī)矩追溯至object的new()方法,因為object是所有新式類的基類。

新式類開始實例化時,new()方法會返回cls(cls指代當前類)的實例,然后該類的init()方法作為構造方法會接收這個實例(即self)作為自己的第一個參數,然后依次傳入new()方法中接收的位置參數和命名參數。

注意:如果new()沒有返回cls(即當前類)的實例,那么當前類的init()方法是不會被調用的。如果new()返回其他類(新式類或經典類均可)的實例,那么只會調用被返回的那個類的構造方法。

第一個參數cls是當前正在實例化的類

def __new__(cls, *args, **kwargs):
    ...
    return object.__new__(cls)

二、描述符相關

如果一個對象定義了這三種方法的任何一種,它就是一個描述符(descriptor)。
描述符詳解參考我另一篇文章

1、__get__

獲取屬性時調用,返回設置的屬性值,通常是set中的value,或者附加的其他組合值。

2、__set__

設置屬性時調用,返回None.

3、__delete__

刪除屬性時調用,返回None


二、屬性操作和訪問相關

1、__getattr__

訪問屬性不存在時調用改方法

2、__setattr__

修改屬性不存在時調用改方法

3、__getattribute__ 不需要自行定義,除非對屬性訪問有特殊的要求

對新式類的實例來說,所有屬性和方法的訪問操作都是通過getattribute完成,這是由object基類實現的。如果有特殊的要求,可以重載getattribute方法。
每次通過實例訪問屬性,都會經過getattribute函數。而當屬性不存在時,仍然需要訪問getattribute,不過接著要訪問getattr。這就好像是一個異常處理函數。
__getattribute__ 有關 的屬性搜索策略參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 內置函數Python解釋器內置了許多功能和類型,總是可用的。他們是按字母順序列在這里。 abs(x)返回一個數的絕...
    uangianlap閱讀 1,267評論 0 0
  • Python下一切皆對象,每個對象一般都有多個屬性(attribute)。同樣每個Python類會帶有內置屬性(包...
    mysimplebook閱讀 349評論 0 0
  • Python一切皆對象(object),每個對象都可能有多個屬性(attribute)。Python的屬性有一套統...
    愛折騰的大懶豬閱讀 264評論 0 5
  • abs() 函數 描述 abs() 函數返回數字的絕對值。 語法 以下是 abs() 方法的語法: abs( x ...
    時光是座城閱讀 506評論 0 2
  • 根據物理學的原理,速度與時間成反比。在我們所處的這個飛速發(fā)展的時代,當我們貪婪地享受噴氣飛機、高速列車、家...
    8d492217f818閱讀 235評論 0 0