日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python反射和高阶内置方法

發(fā)布時(shí)間:2025/3/20 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python反射和高阶内置方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.isinstance:判斷對(duì)象和類的關(guān)系

#判斷結(jié)果返回bool類型 class A:pass class B(A):pass a = A() print(isinstance(a,A)) #True isinstance(對(duì)象,類)

2.issubclass:判斷子類和父類的關(guān)系

#判斷結(jié)果返回bool類型 class A:pass class B(A):pass a = A() print(issubclass(B,A)) #True issubclass(子類,父類)

3.反射

是用字符串類型的名字,去操作變量
反射對(duì)象中的屬性和方法:

  • hasattr
  • getattr
  • setattr
  • delattr

3.1 getattr(重要)

反射對(duì)象的屬性 —getattr(對(duì)象,屬性)

''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' class A:def func(self):print('in func')a = A() a.name = 'liyanan' a.age = 18 # 反射對(duì)象的屬性 --getattr(對(duì)象,屬性) ret = getattr(a,'name') # 通過變量名的字符串形式取到的值 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()反射類的屬性class A:price = 20def func(self):print('in func')# 反射類的屬性 # A.price print(getattr(A,'price'))

反射類的方法

''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' class A:price = 20@classmethoddef func(self):print('in func')# 反射類的方法:classmethod staticmethod # A.func() if hasattr(A,'func'): #判斷類中是否存在第二個(gè)參數(shù)的方法getattr(A,'func')() #如果有就執(zhí)行

反射模塊的屬性

import my # my為自己寫的其他模塊 #反射模塊的屬性 my.day為模塊的屬性 print(getattr(my,'day'))

反射模塊的方法

#反射模塊的方法 getattr(my,'func')()

內(nèi)置模塊也能用反射

反射自己模塊中的變量和函數(shù)

''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和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))#反射自己模塊中的函數(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) #打印taibaijinxing

3.4 delattr(了解)

刪除一個(gè)變量

''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' 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)用了父類的name屬性 delattr(A,'name') print(a.name) #報(bào)錯(cuò),沒有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') # 打開文件,拿到了文件操作句柄 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 liyanan

item方法

  • getitem
  • setitem
  • delitem
  • 附加的delattr
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' class Foo:def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sex#getitem方法def __getitem__(self, item):if hasattr(self,item): #判斷item是否存在/傳值return self.__dict__[item]#setitem方法def __setitem__(self, key, value):self.__dict__[key] = value#delitem方法def __delitem__(self, key):del self.__dict__[key]#delattr方法def __delattr__(self, item):print('del obj.key時(shí),我執(zhí)行')self.__dict__.pop(item)f = Foo('alec','18','男') print(f['name']) #f['']這種格式默認(rèn)執(zhí)行了類中的__getitem__方法,等于f.namef['hobby'] = 'python' #默認(rèn)調(diào)用了setitem方法,使類中的字典添加了key和value print(f.hobby,f['hobby']) #結(jié)果都為pythondel f.hobby #先調(diào)用類中的delattr方法,如果沒有就調(diào)用object中的(直接刪除) del f['hobby'] #默認(rèn)調(diào)用了delitem方法,刪除了類中的靜態(tài)屬性

__new__用法(面試會(huì)考)

所有的類中都是先執(zhí)行__new__方法,再執(zhí)行__init__方法

使用場(chǎng)景:設(shè)計(jì)模式:單例模式:只能有一個(gè)實(shí)例化對(duì)象,后面實(shí)例化的對(duì)象屬性都會(huì)覆蓋第一個(gè)對(duì)象的屬性,如果沒有覆蓋則用第一個(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ì)象<北京>沒有覆蓋,則用第一個(gè)對(duì)象的屬性

__eq__方法

用法:比較實(shí)例化后的對(duì)象屬性是否相等

''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和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()是系統(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)存地址處理的 #此類中的自己寫的哈希算法是根據(jù)值來處理的

示例:

實(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ǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。