與類有關的幾個函數
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__
方法
第一個參數為當前類對象self
def __call__(self, *args, **kwargs):
...
3、__str__ ()
和 __repr__()
__str__ ()
在對象當字符串使用時觸發(fā),返回一個很好地向人描述對象的字符串。
__repr__()
在對象當字符串使用時觸發(fā),返回供解釋器讀取的字符串,一般是返回類名。
使用str()或repr()方法來解析對象時, 就會觸發(fā)對象的str和repr方法。
如果實現了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__
有關 的屬性搜索策略參考