這篇文章主要講解了“python面向對象編程的反射怎么理解”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python面向對象編程的反射怎么理解”吧!
作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設機構,我們在業(yè)內良好的客戶口碑。創(chuàng)新互聯(lián)建站提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設計、網(wǎng)站制作、網(wǎng)站設計、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運營等一系列服務,幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經營模式與有效的網(wǎng)絡營銷方法,創(chuàng)造更大的價值。
python中的反射是去命名空間中尋找字符串形式的名字所指向的內存地址,對該內存地址進行獲取、添加、刪除、判斷等操作。反射是一種基于字符串的事件驅動!它的功能非常強大,熟練掌握后可以在很多場景用來簡化代碼。
參數(shù):
參數(shù)有二個:第一參數(shù)用來指定命名空間;第二參數(shù)是字符串格式的名字,若名字不存在會報錯。
作用:
返回指定命名空間內字符串格式的名字所指向的內存地址(該地址存儲的若是字符串則可將其當字符串用,若是代碼塊則可調用它)。
案例:
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’這個名字。
參數(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這個名字,判斷結果是True,表示有這個名字。
print(hasattr(Animal, ‘name’))語句是判斷類Animal的命名空間中是否有name這個名字,判斷結果是False,表示沒有這個名字。
參數(shù):
參數(shù)有一個:參數(shù)是內存地址(可以是名字指向的或getattr返回的)。
作用:
判斷內存地址中存放的是不是代碼塊,是則返回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指向的是不是代碼塊。判斷結果是True,表示是代碼塊。
print(callable(getattr(Animal, ‘kind’)))語句是打印判斷類Animal的命名空間中kind指向的是不是代碼塊。判斷結果是False,表示不是代碼塊。
參數(shù):
參數(shù)有三個:第一參數(shù)是命名空間;第二參數(shù)是名字;第三參數(shù)是代碼塊所在的內存地址(可以是名字或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的所有實例均可調用work方法。
setattr(white_cat, ‘work’, work)是給實例white_cat綁定work方法,調用時要把實例本身作為第一參數(shù),例如:white_cat.work(white_cat)。
另外給實例綁定方法后該方法只存在于實例的命名空間,Animal類的其他實例不能調用!
參數(shù):
參數(shù)有二個:第一參數(shù)用來指定命名空間;第二參數(shù)是字符串格式的名字,若該名字不存在會報錯。
作用:
該函數(shù)的作用是查找指定命名空間內字符串格式的名字,若找到則將其刪除并釋放資源,若找不到則報錯。返回值是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ù)只在指定的命名空間中找名字,不會按類的繼承順序去本類、父類、祖父類等命名空間找名字。這和調用實例的屬性或方法時不一樣。
調用時實例的屬性或方法時若實例自身的命名空間中沒有這個名字則會按類的繼承順序去本類、父類、祖父類等命名空間找名字。
感謝各位的閱讀,以上就是“python面向對象編程的反射怎么理解”的內容了,經過本文的學習后,相信大家對python面向對象編程的反射怎么理解這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!