1. 程式人生 > >python學習之-反射

python學習之-反射

什麼是反射

用字串來操作物件或者類的屬性

PS:其實就是將字串對映到屬性身上來進行操作

 

hasattr (判斷物件有沒有屬性)

hasattr(o,name): 有兩個引數,o指的就是物件的意思(也可以放類,python中一切皆物件),name就是屬性名

例:需求訪問類下的x屬性
class Foo:
x=1
def __init__(self,m,n):
self.m=m
self.n=n

def func1(self):
print('<%s:%s>' %(self.m,self.n))
PS:類的底層原理就是產生一個字典將函式或者引數放入字典以key=value形式,底層原理就是判斷'x' in Foo.__dict__
print(hasattr(Foo,'x')) #這個方法就是判斷能不能Foo.x訪問到x的屬性,會返回一個bool值,True就是表示存在這個屬性可以訪問

 

getattr(o,name,default):有三個引數,o指的就是物件,name就是屬性必須是字串格式,default就是一個預設返回值

class Foo:
x=1
def __init__(self,m,n):
self.m=m
self.n=n

def func1(self):
print('<%s:%s>' %(self.m,self.n))

getattr
res=getattr(Foo,'x') #類中有這個屬性,就會返回x的值

print(res)
PS:底層原理就是以字典中的key取到的value值放入變數 res=Foo.__dict__['x']

res=getattr(Foo,'y',None) #類中沒有y這個屬性
print(res) #列印就會報錯
PS:default設定一個預設值,在屬性不存在的時候就不會報錯了,這個預設值一般設定成None

res=getattr(Foo,'func1')
print(res)

 

setattr(o,name,value):有三個引數,一個是物件,一個是字串形式的屬性,一個是值

class Foo:
x=1
def __init__(self,m,n):
self.m=m
self.n=n

def func1(self):
print('<%s:%s>' %(self.m,self.n))
setattr(Foo,'x',222) #修改字典值
print(Foo.x) #檢視有沒有修改成功
PS:底層原理就是修改字典的value值,Foo.__dict__['x']=222

delattr(o,name):l有兩個引數,一個是物件,一個是字串形式的屬性

class Foo:
x=1
def __init__(self,m,n):
self.m=m
self.n=n

def func1(self):
print('<%s:%s>' %(self.m,self.n))
delattr(Foo,'x') #刪除x這個屬性
print(Foo.__dict__) #檢視字典中有沒有,驗證刪除成功否

 

例:以物件去訪問檢視

class Foo:
x=1
def __init__(self,m,n):
self.m=m
self.n=n

def func1(self):
print('<%s:%s>' %(self.m,self.n))


obj=Foo(10,20) #物件就必須傳入對應的值
print(hasattr(obj,'x')) #以物件去判定
print(getattr(obj,'x')) #以物件去檢視
setattr(obj,'zzz',111111) #以物件去修改
print(obj.__dict__) #檢視修改成功否

 

反射例項

class Ftp:
def get(self): #下載功能
print('get...')

def put(self): #上傳功能
print('put...')

def ls(self):
print('ls...')

def run(self): #使用者互動功能
while True:
cmd=input('>>>: ').strip()
if hasattr(self,cmd): #用hasattr去判斷功能存不存在,兩個引數一個是物件就是功能,self就是類本身,一個就是使用者輸入的屬性,對應類下的功能名
func=getattr(self,cmd) #如果存在則執行,getter也是兩個引數,一個是類,字串形式的屬性,self對應類,cmd對應的函式名
func()
else:
print('輸入的指令不存在')


obj=Ftp()
obj.run()

PS:python中一切皆物件的概念,模組也是物件,所以也可以判斷一個模組裡有沒有需要判斷的屬性,也可以將模組反射到字串上做操作