python反射和高阶内置方法
生活随笔
收集整理的這篇文章主要介紹了
python反射和高阶内置方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.isinstance:判斷對象和類的關系
#判斷結果返回bool類型 class A:pass class B(A):pass a = A() print(isinstance(a,A)) #True isinstance(對象,類)2.issubclass:判斷子類和父類的關系
#判斷結果返回bool類型 class A:pass class B(A):pass a = A() print(issubclass(B,A)) #True issubclass(子類,父類)3.反射
是用字符串類型的名字,去操作變量
反射對象中的屬性和方法:
- hasattr
- getattr
- setattr
- delattr
3.1 getattr(重要)
反射對象的屬性 —getattr(對象,屬性)
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class A:def func(self):print('in func')a = A() a.name = 'liyanan' a.age = 18 # 反射對象的屬性 --getattr(對象,屬性) ret = getattr(a,'name') # 通過變量名的字符串形式取到的值 print(ret)user = input('>>>>') print(getattr(a,user)) #假如輸入name,則執行a.name反射對象的方法 —getattr(對象,方法)
#接上 # 反射對象的方法 ret = getattr(a,'func') #getattr(a,'func') == a.func ret()反射類的屬性class A:price = 20def func(self):print('in func')# 反射類的屬性 # A.price print(getattr(A,'price'))反射類的方法
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class A:price = 20@classmethoddef func(self):print('in func')# 反射類的方法:classmethod staticmethod # A.func() if hasattr(A,'func'): #判斷類中是否存在第二個參數的方法getattr(A,'func')() #如果有就執行反射模塊的屬性
import my # my為自己寫的其他模塊 #反射模塊的屬性 my.day為模塊的屬性 print(getattr(my,'day'))反射模塊的方法
#反射模塊的方法 getattr(my,'func')()內置模塊也能用反射
反射自己模塊中的變量和函數
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import sys # print(sys.modules['__main__']) year = 2019 def login():print('welcome')#反射自己模塊中的變量 print(getattr(sys.modules[__name__],'year')) user_in = input('>>>') print(getattr(sys.modules[__name__],user_in))#反射自己模塊中的函數 getattr(sys.modules[__name__],'login')()3.2 hasattr
與getattr配合使用,主要做判斷
注意參數要跟getattr保持一致
import sysyear = 2019if hasattr(sys.modules[__name__],'year'):print(getattr(sys.modules[__name__],'year'))3.3 setattr(了解)
設置修改變量
setattr(對象,‘要修改的屬性’,‘修改的內容’)
class A:passa = A() setattr(a,'name','nezha') setattr(A,'name','taibaijinxing') print(a.name) #打印nezha print(A.name) #打印taibaijinxing3.4 delattr(了解)
刪除一個變量
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class A:passa = A() setattr(a,'name','nezha') setattr(A,'name','taibaijinxing')delattr(a,'name') print(a.name) #打印taibaijinxing,因為實例化對象調用了父類的name屬性 delattr(A,'name') print(a.name) #報錯,沒有name屬性4.高階內置方法
__del__方法:析構函數:在刪除一個對象之前,進行的一些收尾工作
class A:def __del__(self): #析構函數:在刪除一個對象之前進行一些收尾工作self.f.close()a = A() a.f = open('db.txt','r',encoding='utf-8') # 打開文件,拿到了文件操作句柄 del a #del既執行了這個方法,又刪除了變量__call__方法:實例化后的對象加括號,相當于默認執行了此方法
class A:def __init__(self,name):self.name = namedef __call__(self, *args, **kwargs):for k in self.__dict__:print(k,self.__dict__[k])a = A('liyanan')() #實例化對象后加括號相當于執行了內部的__call__方法 #a() 結果為打印self.__dict__中的靜態屬性 name liyananitem方法
- getitem
- setitem
- delitem
- 附加的delattr
__new__用法(面試會考)
所有的類中都是先執行__new__方法,再執行__init__方法
使用場景:設計模式:單例模式:只能有一個實例化對象,后面實例化的對象屬性都會覆蓋第一個對象的屬性,如果沒有覆蓋則用第一個對象的屬性
#單例模式 class A:__instance = False #設置一個私有屬性def __init__(self,name,age):self.name = nameself.age = agedef __new__(cls, *args, **kw): #先執行new,再執行__init__方法if cls.__instance:return cls.__instancecls.__instance = object.__new__(cls)return cls.__instanceyanan = A('yanan',26) yanan.cloth = 'cool' beijing = A('beijing',23) print(yanan) #<__main__.A object at 0x000001B336D38C50> print(beijing) #<__main__.A object at 0x000001B336D38C50> 一樣的內存地址,證明只能實例化一個對象 print(yanan.name) #beijing 被第二次實例化對象<北京>給覆蓋了 print(beijing.name) #beijing print(beijing.cloth) #cool 第二次實例化對象<北京>沒有覆蓋,則用第一個對象的屬性__eq__方法
用法:比較實例化后的對象屬性是否相等
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class A:def __init__(self,name):self.name = name#eq方法def __eq__(self, other):if self.__dict__ == other.__dict__:return Trueelse:return Falseob1 = A('pig') ob2 = A('pig') print(ob1 == ob2) #True__hash__方法
hash()是系統的哈希用法,以對象的內存地址進行哈希的
__hash__可以自己控制哈希用法
class A:def __init__(self,name,sex):self.name = nameself.sex = sexdef __hash__(self):return hash(self.name+self.sex)a = A('agg','公') b = A('agg','公') print(hash(a)) print(hash(b)) #系統的哈希用法是根據內存地址處理的 #此類中的自己寫的哈希算法是根據值來處理的示例:
實例化對象去重
class A:def __init__(self,name,sex,age):self.name = nameself.sex = sexself.age = agedef __eq__(self, other):if self.name == other.name and self.sex == other.sex:return Truereturn Falsedef __hash__(self):return hash(self.name + self.sex)a = A('agg','公',5) b = A('agg','公',5) print(hash(a)) print(hash(b)) print(set((a,b))) #去重,去除重復的實例化對象(只去重name和sex)總結
以上是生活随笔為你收集整理的python反射和高阶内置方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中怎么取两个列表 集合的交集
- 下一篇: Python对字符串进行左右中对齐