溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python面向?qū)ο缶幊痰姆瓷湓趺蠢斫?/h1>
發(fā)布時間:2021-11-25 09:21:14 來源:億速云 閱讀:150 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“python面向?qū)ο缶幊痰姆瓷湓趺蠢斫狻?,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“python面向?qū)ο缶幊痰姆瓷湓趺蠢斫狻卑桑?/p>

反射的定義

python中的反射是去命名空間中尋找字符串形式的名字所指向的內(nèi)存地址,對該內(nèi)存地址進行獲取、添加、刪除、判斷等操作。反射是一種基于字符串的事件驅(qū)動!它的功能非常強大,熟練掌握后可以在很多場景用來簡化代碼。

getattr

參數(shù)

參數(shù)有二個:第一參數(shù)用來指定命名空間;第二參數(shù)是字符串格式的名字,若名字不存在會報錯。

作用

返回指定命名空間內(nèi)字符串格式的名字所指向的內(nèi)存地址(該地址存儲的若是字符串則可將其當(dāng)字符串用,若是代碼塊則可調(diào)用它)。

案例

class Animal:kind = '動物'def __init__(self, name):self.name = namedef eat(self):print(f'{self.name}正在進食!')white_cat = Animal('白貓')print(getattr(white_cat, 'name'))print(getattr(Animal, 'kind'))getattr(white_cat, 'eat')()print(getattr(Animal, 'name'))out:白貓
動物
白貓正在進食!
AttributeError: type object 'Animal' has no attribute 'name'

講解

上述案例中定義了Animal類并創(chuàng)建了它的實例white_cat。

print(getattr(white_cat, ‘name’))語句等價于print(white_cat.name);

getattr(white_cat, ‘eat’)()語句等價于white_cat.eat()。

print(getattr(Animal, ‘name’))獲取Animal命名空間中的’name’時報錯了,因為Animal命名空間中沒有’name’這個名字。

hasattr

參數(shù)

參數(shù)有二個:第一參數(shù)用來指定命名空間;第二參數(shù)是字符串格式的名字。

作用

判斷指定命名空間中有沒有那個名字,有則返回True,沒有則返回False。

案例

class Animal:kind = '動物'def __init__(self, name):self.name = namedef eat(self):print(f'{self.name}正在進食!')white_cat = Animal('白貓')print(hasattr(white_cat, 'eat'))print(hasattr(Animal, 'name'))out:TrueFalse

講解

上述案例中定義了Animal類并創(chuàng)建了它的實例white_cat。

print(hasattr(white_cat, ‘eat’))語句是判斷實例white_cat的命名空間中是否有eat這個名字,判斷結(jié)果是True,表示有這個名字。

print(hasattr(Animal, ‘name’))語句是判斷類Animal的命名空間中是否有name這個名字,判斷結(jié)果是False,表示沒有這個名字。

callable

參數(shù)

參數(shù)有一個:參數(shù)是內(nèi)存地址(可以是名字指向的或getattr返回的)。

作用

判斷內(nèi)存地址中存放的是不是代碼塊,是則返回True,不是則返回False。

案例

class Animal:kind = '動物'def __init__(self, name):self.name = namedef eat(self):print(f'{self.name}正在進食!')white_cat = Animal('白貓')print(callable(getattr(white_cat, 'eat')))print(callable(getattr(Animal, 'kind')))out:TrueFalse

講解

上述案例中定義了Animal類并創(chuàng)建了它的實例white_cat。

print(callable(getattr(white_cat, ‘eat’)))語句是打印判斷實例white_cat的命名空間中eat指向的是不是代碼塊。判斷結(jié)果是True,表示是代碼塊。

print(callable(getattr(Animal, ‘kind’)))語句是打印判斷類Animal的命名空間中kind指向的是不是代碼塊。判斷結(jié)果是False,表示不是代碼塊。

setattr

參數(shù)

參數(shù)有三個:第一參數(shù)是命名空間;第二參數(shù)是名字;第三參數(shù)是代碼塊所在的內(nèi)存地址(可以是名字或getattr返回的)。

作用

該函數(shù)的作用是給指定命名空間(第一參數(shù))添加指定名字(第二參數(shù))的代碼塊(第三參數(shù)),返回值是None。

案例

class Animal:kind = '動物'def __init__(self, name):self.name = namedef eat(self):print(f'{self.name}正在進食!')white_cat = Animal('白貓')def work(self):print(f'{self.name}正在干活!')setattr(Animal, 'work', work)white_cat.work()out:白貓正在干活!

講解

使用該函數(shù)時要注意以下幾點:

setattr(Animal, ‘work’, work)是給Animal類綁定work方法,這樣Animal的所有實例均可調(diào)用work方法。

setattr(white_cat, ‘work’, work)是給實例white_cat綁定work方法,調(diào)用時要把實例本身作為第一參數(shù),例如:white_cat.work(white_cat)。

另外給實例綁定方法后該方法只存在于實例的命名空間,Animal類的其他實例不能調(diào)用!

delattr

參數(shù)

參數(shù)有二個:第一參數(shù)用來指定命名空間;第二參數(shù)是字符串格式的名字,若該名字不存在會報錯。

作用

該函數(shù)的作用是查找指定命名空間內(nèi)字符串格式的名字,若找到則將其刪除并釋放資源,若找不到則報錯。返回值是None。

案例

class Animal:kind = '動物'def __init__(self, name):self.name = namedef eat(self):print(f'{self.name}正在進食!')white_cat = Animal('白貓')delattr(white_cat, 'name')delattr(Animal, 'eat')print(white_cat.name)print(Animal.eat)out:AttributeError: 'Animal' object has no attribute 'name'

講解

請注意delattr函數(shù)只在指定的命名空間中找名字,不會按類的繼承順序去本類、父類、祖父類等命名空間找名字。這和調(diào)用實例的屬性或方法時不一樣。

調(diào)用時實例的屬性或方法時若實例自身的命名空間中沒有這個名字則會按類的繼承順序去本類、父類、祖父類等命名空間找名字。

感謝各位的閱讀,以上就是“python面向?qū)ο缶幊痰姆瓷湓趺蠢斫狻钡膬?nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對python面向?qū)ο缶幊痰姆瓷湓趺蠢斫膺@一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)
AI