與類有關(guān)的幾個(gè)函數(shù)
1川抡、getattrr():獲取對(duì)象的屬性和方法
getattr有三個(gè)參數(shù):getattr(對(duì)象名或類名辐真,屬性,‘default’)
最后一個(gè)default是默認(rèn)值崖堤,也就是某個(gè)類或者某個(gè)對(duì)象沒有你要獲取的屬性或者方法時(shí)侍咱,返回default
2、setattrr():設(shè)置一個(gè)不存在的屬性
setattr(對(duì)象名或類名倘感,屬性名放坏,設(shè)置的值)
使用setattr時(shí)有兩種情況:
第一種就是原本對(duì)象或者類內(nèi)并沒有這個(gè)屬性,我可以通過setattr來進(jìn)行添加并賦值
第二種就是老玛,假如某對(duì)象或者類內(nèi)已經(jīng)存在某屬性淤年,再用setattr進(jìn)行操作的話就相當(dāng)于對(duì)該屬性值進(jìn)行修改
3、hasattrr():判斷對(duì)象有沒有某屬性或者方法蜡豹,返回布爾值
hasattr(對(duì)象或類名麸粮,要檢查的屬性名或方法名)
4、delattrr():刪除屬性
類屬性只能通過類名來刪
5镜廉、isinstancer():檢查是不是這個(gè)對(duì)象產(chǎn)生的實(shí)例弄诲,返回布爾值
6、issubclassr():檢查一個(gè)類是否是另一個(gè)類的子類娇唯,返回布爾值
7齐遵、dir() : 獲取對(duì)象的成員列表
die(類)和dir(實(shí)例對(duì)象)輸出一致
8、property() ------使用在類的內(nèi)部處理set和get方法
property() 函數(shù)的作用是在新式類中返回屬性值塔插。
class property([fget[, fset[, fdel[, doc]]]])
- fget -- 獲取屬性值的函數(shù)
- fset -- 設(shè)置屬性值的函數(shù)
- fdel -- 刪除屬性值函數(shù)
- doc -- 屬性描述信息
對(duì)應(yīng)實(shí)現(xiàn)了自己的get_attr 和set_attr或del_attr方法的屬性, 如果想要替換成新式類的用法, 而不影響之前類的調(diào)用邏輯, 可以使用property綁定其get,set,del方法, 從而在正常的 點(diǎn)(.)訪問和修改操作時(shí)能夠正常映射到這些方法梗摇。
#使用property綁定fee 的get_fee和set_fee方法
fee = property(get_fee, set_fee)
除了使用property將get, Set方法映射到對(duì)屬性的訪問上, 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
類內(nèi)置屬性
1想许、__name__
文檔伶授,也就是獲取類的名稱
2断序、__doc__
文檔,也就是獲取類的注釋文檔
注意它只返回第一個(gè)三對(duì)單引號(hào)或三對(duì)雙引號(hào)的類的注釋文檔糜烹。
3违诗、__dict__
:
dict是用來存儲(chǔ)對(duì)象屬性的一個(gè)字典,其鍵為屬性名疮蹦,值為屬性的值诸迟。
許多內(nèi)建類型就沒有__dict__
屬性,如list挚币,此時(shí)就需要用dir()來列出對(duì)象的所有屬性亮蒋。
- 類的dict存儲(chǔ)所有實(shí)例共享的變量和函數(shù)(
類屬性,方法等
)妆毕,類的dict并不包含其父類的屬性慎玖。 - 實(shí)例的dict僅存儲(chǔ)與該實(shí)例相關(guān)的實(shí)例屬性('不包含類屬性'),正是因?yàn)閷?shí)例的dict屬性笛粘,每個(gè)實(shí)例的實(shí)例屬性才會(huì)互不影響趁怔。
4、__bases__
:
可知道這個(gè)類的父類是誰
類魔術(shù)方法
一薪前、操作相關(guān)
1润努、__init__ ()
初始化函數(shù)(構(gòu)造函數(shù))
Python的類中可以有很多個(gè)構(gòu)造函數(shù),但是最后一個(gè)構(gòu)造函數(shù)會(huì)覆蓋掉上面的構(gòu)造函數(shù)示括,所以铺浇,只有最后一個(gè)init函數(shù)有效, 可以通過定義類方法實(shí)現(xiàn)多個(gè)構(gòu)造方法的技巧。
2垛膝、__call__()
對(duì)象當(dāng)函數(shù)使用時(shí)觸發(fā)
實(shí)例化對(duì)象()自動(dòng)調(diào)用類中的__call__
方法
第一個(gè)參數(shù)為當(dāng)前類對(duì)象self
def __call__(self, *args, **kwargs):
...
3鳍侣、__str__ ()
和 __repr__()
__str__ ()
在對(duì)象當(dāng)字符串使用時(shí)觸發(fā),返回一個(gè)很好地向人描述對(duì)象的字符串。
__repr__()
在對(duì)象當(dāng)字符串使用時(shí)觸發(fā),返回供解釋器讀取的字符串,一般是返回類名吼拥。
使用str()或repr()方法來解析對(duì)象時(shí), 就會(huì)觸發(fā)對(duì)象的str和repr方法倚聚。
如果實(shí)現(xiàn)了repr而沒有定義str,那么對(duì)象將會(huì)表現(xiàn)出str = repr
4凿可、__new__()
--重要
特性:
-
__new__
方法是在類準(zhǔn)備將自身實(shí)例化時(shí)調(diào)用惑折。 -
__new__
方法始終都是類的靜態(tài)方法,即使沒有被加上靜態(tài)方法裝飾器
在定義新式類時(shí)沒有重新定義new()時(shí)枯跑,Python默認(rèn)是調(diào)用該類的直接父類的new()方法來構(gòu)造該類的實(shí)例惨驶,如果該類的父類也沒有重寫new(),那么將一直按此規(guī)矩追溯至object的new()方法敛助,因?yàn)閛bject是所有新式類的基類敞咧。
新式類開始實(shí)例化時(shí),new()方法會(huì)返回cls(cls指代當(dāng)前類)的實(shí)例辜腺,然后該類的init()方法作為構(gòu)造方法會(huì)接收這個(gè)實(shí)例(即self)作為自己的第一個(gè)參數(shù)休建,然后依次傳入new()方法中接收的位置參數(shù)和命名參數(shù)。
注意:如果new()沒有返回cls(即當(dāng)前類)的實(shí)例评疗,那么當(dāng)前類的init()方法是不會(huì)被調(diào)用的测砂。如果new()返回其他類(新式類或經(jīng)典類均可)的實(shí)例,那么只會(huì)調(diào)用被返回的那個(gè)類的構(gòu)造方法百匆。
第一個(gè)參數(shù)cls是當(dāng)前正在實(shí)例化的類
def __new__(cls, *args, **kwargs):
...
return object.__new__(cls)
二砌些、描述符相關(guān)
如果一個(gè)對(duì)象定義了這三種方法的任何一種,它就是一個(gè)描述符(descriptor)加匈。
描述符詳解參考我另一篇文章
1存璃、__get__
獲取屬性時(shí)調(diào)用,返回設(shè)置的屬性值雕拼,通常是set中的value,或者附加的其他組合值纵东。
2、__set__
設(shè)置屬性時(shí)調(diào)用啥寇,返回None.
3偎球、__delete__
刪除屬性時(shí)調(diào)用,返回None
二辑甜、屬性操作和訪問相關(guān)
1衰絮、__getattr__
訪問屬性不存在時(shí)調(diào)用改方法
2、__setattr__
修改屬性不存在時(shí)調(diào)用改方法
3磷醋、__getattribute__
不需要自行定義,除非對(duì)屬性訪問有特殊的要求
對(duì)新式類的實(shí)例來說猫牡,所有屬性和方法的訪問操作都是通過getattribute完成,這是由object基類實(shí)現(xiàn)的邓线。如果有特殊的要求淌友,可以重載getattribute方法。
每次通過實(shí)例訪問屬性褂痰,都會(huì)經(jīng)過getattribute函數(shù)亩进。而當(dāng)屬性不存在時(shí),仍然需要訪問getattribute缩歪,不過接著要訪問getattr归薛。這就好像是一個(gè)異常處理函數(shù)。
與__getattribute__
有關(guān) 的屬性搜索策略參考