python之反射


什么是反射?
1、有時我們要訪問某個變量或是方法時並不知道到底有沒有這個變量或方法,所以就要做些判斷。判斷是否存在字符串對應的變量及方法。
2、我們知道訪問變量時是不能加引號的,否則會被當成字符串處理。如果要通過字符串找到對應的變量,那該怎么辦呢

反射就是用於解決上面兩個問題而產生的,所謂反射,按我的理解就是反過來告訴我字符串是什么,是變量or方法

python中訪問類或對象的成員有三種方法
##如下所示 obj 為對象 var為變量 func為函數
1、obj.var 或 obj.func()
2、obj.__dict__['var']
3、getattr(obj,'var')

反射有4個方法 getattr() hasattr() setattr() delattr()

舉例子如下,一目了然

class A(object):
    gvar = 'min'
    def __init__(self,name,male):
        self.name = name
        self.male = male
    def func1(self):
        print "func1 :my name is %s" % self.name
    def func2(self):
        print "func2 :I'm a %s" % self.male

##實例化對象
obj = A('min','girl')
hasattr(obj,'gvar')
hasattr(obj,'func1')
getattr(obj,'gvar')
getattr(obj,'name')
getattr(obj,'func1')
getattr(obj,'func2')()
setattr(obj,'gvar','ben')
getattr(obj,'gvar')
delattr(obj,'gvar')
##python中一切事物都是對象,故其實上面的obj也是可以是類名,模塊名
getattr(A,'func2')
hasattr(A,'func1')
示例代碼

#當某個字符串就是模塊名時,我們導入模塊時可以用以下方法導入
mymodule = __import__(var) #這個就相當於導入模塊var.py了

導入后,你可以在你的代碼中用mymodule.*來調用該模塊下的任意方法

 1 >>> class A(object):
 2 ...     gvar = 'min'
 3 ...     def __init__(self,name,male):
 4 ...         self.name = name
 5 ...         self.male = male
 6 ...     def func1(self):
 7 ...         print "func1 :my name is %s" % self.name
 8 ...     def func2(self):
 9 ...         print "func2 :I'm a %s" % self.male
10 ... 
11 >>> ##實例化對象
12 ... obj = A('min','girl')
13 >>> hasattr(obj,'gvar')
14 True
15 >>> hasattr(obj,'func1')
16 True
17 >>> getattr(obj,'gvar')
18 'min'
19 >>> getattr(obj,'name')
20 'min'
21 >>> getattr(obj,'func1')
22 <bound method A.func1 of <__main__.A object at 0x7f7b89f99a50>>
23 >>> getattr(obj,'func2')()
24 func2 :I'm a girl
25 >>> setattr(obj,'gvar','ben')
26 >>> getattr(obj,'gvar')
27 'ben'
28 >>> delattr(obj,'gvar')
29 >>> ##python中一切事物都是對象,故其實上面的obj也是可以是類名,模塊名
30 ... getattr(A,'func2')
31 <unbound method A.func2>
32 >>> hasattr(A,'func1')
33 True

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM