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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python反射和高阶内置方法

發布時間:2025/3/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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) #打印taibaijinxing

3.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 liyanan

item方法

  • getitem
  • setitem
  • delitem
  • 附加的delattr
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和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時,我執行')self.__dict__.pop(item)f = Foo('alec','18','男') print(f['name']) #f['']這種格式默認執行了類中的__getitem__方法,等于f.namef['hobby'] = 'python' #默認調用了setitem方法,使類中的字典添加了key和value print(f.hobby,f['hobby']) #結果都為pythondel f.hobby #先調用類中的delattr方法,如果沒有就調用object中的(直接刪除) del f['hobby'] #默認調用了delitem方法,刪除了類中的靜態屬性

__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反射和高阶内置方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。