python基础学习中要懂的知识点:反射机制
反射是什么
反射指在程序運(yùn)行過程中可以動(dòng)態(tài)獲取對(duì)象的信息。 是通過字符串的形式 ,導(dǎo)入模塊;通過字符串的形式,去模塊 尋找指定函數(shù) ,并執(zhí)行。利用字符串的形式去對(duì)象中操作成員,一種 基于字符串的驅(qū)動(dòng) 。
Python反射中的內(nèi)置函數(shù)
getattr()
getattr():用于獲取 對(duì)象中的屬性 ,但是其不能獲取 私有變量 也就是最前面帶 __ 的屬性或方法,getattr(object,name,default)其有三個(gè)參數(shù)
- object :對(duì)象
- name :對(duì)象中的屬性值
- default :可選 該對(duì)象中不存在該屬性的時(shí)候的返回值。
例子:
class B:def __init__(self):self.name = 'Bb'self.age = 40def add(self):print('B')if __name__ == '__main__':b = B()print(getattr(b, 'name', 'not found')) # 輸出:Bbprint(getattr(b, 'cc', 'not found')) # 輸出:not foundfunc = getattr(b,'add',None)print(func) # 輸出:<bound method B.add of <__main__.B object at 0x00000248C7F48648>>func() # 輸出:Bhasattr()
hasattr(object,name)該函數(shù)用于檢測對(duì)象( object )中是否含有name (指的是某個(gè)屬性名而并不是指name) 這個(gè)屬性,其中object是對(duì)象,name是指需要檢查該對(duì)象中是否存在的屬性的名稱。
例子:
''' 學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' class B:def __init__(self):self.name = 'Bb'self.age = 40def add(self):print('B')if __name__ == '__main__':b = B()print(hasattr(b, 'ccc')) # Falseprint(hasattr(b, 'add')) # Truesetattr()
setattr(object,name,value)是指給某個(gè)對(duì)象某個(gè)屬性設(shè)置指定的值,object是對(duì)象,name是對(duì)象中的屬性名,value是你想要設(shè)的值。其中三個(gè)參數(shù)都是必須的填的。
該函數(shù)可以給對(duì)象增加新的屬性并且可以將對(duì)象中的方法改變。
例子:
class B:def __init__(self):self.name = 'Bb'self.age = 40def add(self):print('B')if __name__ == '__main__':b = B()print(b.age) # 40setattr(b,'age',50)print(b.age) # 50def cc():print('i am changed')b.add() # Bsetattr(b,'add',cc)b.add() # i am changed# print(dir(b))delattr()
delattr(object,name)指刪除對(duì)象中的指定屬性,其中object是對(duì)象,name是對(duì)象中的屬性名。
例子:
''' 學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' class B:def __init__(self):self.name = 'Bb'self.age = 40def add(self):print('B')if __name__ == '__main__':b = B()print(dir(b)) # [,'add', 'age', 'name'] dir()函數(shù)會(huì)輸出一大堆,在這里我把輸出的一些屬性名直接刪除了print(hasattr(b,'age')) # Truedelattr(b,'age')print(dir(b)) # [,'add', 'name']print(hasattr(b,'age')) # False我在這里再補(bǔ)充說明下 dir() 這個(gè)函數(shù): dir()不帶變量時(shí)候用于獲取當(dāng)前范圍內(nèi)的變量、方法和定義的類型列表;帶參數(shù)時(shí)返回參數(shù)的屬性、方法列表。
- dir(object) object:對(duì)象、變量、類型
以上就是python反射中的四個(gè)內(nèi)置函數(shù)。
python反射的應(yīng)用
反射的一個(gè)應(yīng)用就是 web框架 中的 url路由 ,用戶通過輸入 url路由 就可以定位到 views視圖 中的函數(shù),這里面主要應(yīng)用了 getattr() 這個(gè)函數(shù),一個(gè)用于獲取 views視圖中對(duì)應(yīng)函數(shù) ,如果沒有就返回你設(shè)定的值以此判斷是否可以往下執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的python基础学习中要懂的知识点:反射机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 一个判断对象是否是一个已知
- 下一篇: Python函数的正确用法及其注意事项