python反射和高阶内置方法
1.isinstance:判斷對(duì)象和類(lèi)的關(guān)系
#判斷結(jié)果返回bool類(lèi)型 class A:pass class B(A):pass a = A() print(isinstance(a,A)) #True isinstance(對(duì)象,類(lèi))2.issubclass:判斷子類(lèi)和父類(lèi)的關(guān)系
#判斷結(jié)果返回bool類(lèi)型 class A:pass class B(A):pass a = A() print(issubclass(B,A)) #True issubclass(子類(lèi),父類(lèi))3.反射
是用字符串類(lèi)型的名字,去操作變量
反射對(duì)象中的屬性和方法:
- hasattr
- getattr
- setattr
- delattr
3.1 getattr(重要)
反射對(duì)象的屬性 —getattr(對(duì)象,屬性)
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' class A:def func(self):print('in func')a = A() a.name = 'liyanan' a.age = 18 # 反射對(duì)象的屬性 --getattr(對(duì)象,屬性) ret = getattr(a,'name') # 通過(guò)變量名的字符串形式取到的值 print(ret)user = input('>>>>') print(getattr(a,user)) #假如輸入name,則執(zhí)行a.name反射對(duì)象的方法 —getattr(對(duì)象,方法)
#接上 # 反射對(duì)象的方法 ret = getattr(a,'func') #getattr(a,'func') == a.func ret()反射類(lèi)的屬性class A:price = 20def func(self):print('in func')# 反射類(lèi)的屬性 # A.price print(getattr(A,'price'))反射類(lèi)的方法
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' class A:price = 20@classmethoddef func(self):print('in func')# 反射類(lèi)的方法:classmethod staticmethod # A.func() if hasattr(A,'func'): #判斷類(lèi)中是否存在第二個(gè)參數(shù)的方法getattr(A,'func')() #如果有就執(zhí)行反射模塊的屬性
import my # my為自己寫(xiě)的其他模塊 #反射模塊的屬性 my.day為模塊的屬性 print(getattr(my,'day'))反射模塊的方法
#反射模塊的方法 getattr(my,'func')()內(nèi)置模塊也能用反射
反射自己模塊中的變量和函數(shù)
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' 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))#反射自己模塊中的函數(shù) getattr(sys.modules[__name__],'login')()3.2 hasattr
與getattr配合使用,主要做判斷
注意參數(shù)要跟getattr保持一致
import sysyear = 2019if hasattr(sys.modules[__name__],'year'):print(getattr(sys.modules[__name__],'year'))3.3 setattr(了解)
設(shè)置修改變量
setattr(對(duì)象,‘要修改的屬性’,‘修改的內(nèi)容’)
class A:passa = A() setattr(a,'name','nezha') setattr(A,'name','taibaijinxing') print(a.name) #打印nezha print(A.name) #打印taibaijinxing3.4 delattr(了解)
刪除一個(gè)變量
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' class A:passa = A() setattr(a,'name','nezha') setattr(A,'name','taibaijinxing')delattr(a,'name') print(a.name) #打印taibaijinxing,因?yàn)閷?shí)例化對(duì)象調(diào)用了父類(lèi)的name屬性 delattr(A,'name') print(a.name) #報(bào)錯(cuò),沒(méi)有name屬性4.高階內(nèi)置方法
__del__方法:析構(gòu)函數(shù):在刪除一個(gè)對(duì)象之前,進(jìn)行的一些收尾工作
class A:def __del__(self): #析構(gòu)函數(shù):在刪除一個(gè)對(duì)象之前進(jìn)行一些收尾工作self.f.close()a = A() a.f = open('db.txt','r',encoding='utf-8') # 打開(kāi)文件,拿到了文件操作句柄 del a #del既執(zhí)行了這個(gè)方法,又刪除了變量__call__方法:實(shí)例化后的對(duì)象加括號(hào),相當(dāng)于默認(rèn)執(zhí)行了此方法
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')() #實(shí)例化對(duì)象后加括號(hào)相當(dāng)于執(zhí)行了內(nèi)部的__call__方法 #a() 結(jié)果為打印self.__dict__中的靜態(tài)屬性 name liyananitem方法
- getitem
- setitem
- delitem
- 附加的delattr
__new__用法(面試會(huì)考)
所有的類(lèi)中都是先執(zhí)行__new__方法,再執(zhí)行__init__方法
使用場(chǎng)景:設(shè)計(jì)模式:單例模式:只能有一個(gè)實(shí)例化對(duì)象,后面實(shí)例化的對(duì)象屬性都會(huì)覆蓋第一個(gè)對(duì)象的屬性,如果沒(méi)有覆蓋則用第一個(gè)對(duì)象的屬性
#單例模式 class A:__instance = False #設(shè)置一個(gè)私有屬性def __init__(self,name,age):self.name = nameself.age = agedef __new__(cls, *args, **kw): #先執(zhí)行new,再執(zhí)行__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> 一樣的內(nèi)存地址,證明只能實(shí)例化一個(gè)對(duì)象 print(yanan.name) #beijing 被第二次實(shí)例化對(duì)象<北京>給覆蓋了 print(beijing.name) #beijing print(beijing.cloth) #cool 第二次實(shí)例化對(duì)象<北京>沒(méi)有覆蓋,則用第一個(gè)對(duì)象的屬性__eq__方法
用法:比較實(shí)例化后的對(duì)象屬性是否相等
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' 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()是系統(tǒng)的哈希用法,以對(duì)象的內(nèi)存地址進(jìn)行哈希的
__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)) #系統(tǒng)的哈希用法是根據(jù)內(nèi)存地址處理的 #此類(lèi)中的自己寫(xiě)的哈希算法是根據(jù)值來(lái)處理的示例:
實(shí)例化對(duì)象去重
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))) #去重,去除重復(fù)的實(shí)例化對(duì)象(只去重name和sex)總結(jié)
以上是生活随笔為你收集整理的python反射和高阶内置方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python中怎么取两个列表 集合的交集
- 下一篇: Python对字符串进行左右中对齐