1. 程式人生 > 實用技巧 >py 中反射的基本應用和總結

py 中反射的基本應用和總結

#反射: 程式可以訪問、檢查和修改它本身的狀態的行為的一種能力
#python中在面向物件中的反射:通過字串的形式操作物件相關屬性,通過字串讓物件自檢是否有字串表示的屬性。
#python當中 反射提供的方法:hasattr/getattr/setattr/delattr

1、hasattr:根據字串的形式去某個模組判斷是否存在某物件
hasattr(obj, 'string') 讓obj自省自檢有沒有和string名符合的屬性,有返回True,沒有返回False。

2、getattr:根據字串的形式去某個模組當中尋找某物件
getattr(obj, 'string', None) 返回obj和string名相同的繫結方法。可以用來讓一個變數引用這個返回結果,後面就可以call這個變數
,相當於call物件的繫結方法.如果沒有,返回None,沒有第三個引數則丟擲異常

3、setattr:根據字串的形式去某個模組當中設定某物件
setattr(obj, 'string', val) obj設定一個和string同名的的屬性,並賦值為val。

4、delattr:根據字串的形式去某個模組當中刪除某物件
delattr(obj, 'string') 刪除obj物件的‘string’的同名的屬性。



哪些物件可以使用反射:
python中一切都是物件,都可以使用反射來進行自檢
1、類可以對類的共有屬性,方法(繫結方法,非繫結方法)進行反射
2、模組也可以進行反射。如:判定匯入的模組是否有某個方法,有就呼叫。
--->實際上,反射在java當中是很強大的東西,但是在python當中也可以使用,比如在一些關鍵字驅動的框架裡面,就會有反射相關的應用

例:=====================
class People(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def speak(self):
        print('%s is speaking' % self.name)

obj = People('qika', 18)
f = input('
qika:').strip() #strip()清除格式 if hasattr(obj, f): #hasattr 判斷是否存在obj,f兩個變數 getattr(obj, f)() func1 = getattr(obj, f) func1() else: print('名字:{} 說:{}'.format(obj.name, f))

例:================================

#物件應用反射
class Foo:
    def __init__(self):
        self.name = 'qika'
        self.age = 18
    def func(self):
        print('hello')
f = Foo()
setattr(f,'sex','')   #設定一個屬性("sex","男")
print(f.sex)   #列印一下里面的這個屬性。其中的f是自己定義的變數,用來接收Foo()類例項化;然後直接呼叫屬性:f.sex
delattr(f,"sex")  #同上,這裡進行“刪除一個屬性”

hasattr(f,'name')  #同上,判斷name屬性是否存在
if hasattr(f,'func'):  #連著一起使用:判斷是否存在
     getattr(f,'func')()    #查詢f(即Foo類例項化的接收的變數名)內這個func這個屬性方法
else:
    print('沒找到')

例:=================================

#類中的反射

class Foo:
    f = 123
    @classmethod
    def class_method_dome(cls):
        print('class_method_dome')

     @staticmethod
    def static_method_dome():
        print('static_method_dome')


print(hasattr(Foo,'class_method_dome'))
method = getattr(Foo,'class_method_dome')
method()
print('------------')
print(hasattr(Foo,'static_method_dome'))
method1 = getattr(Foo,'static_method_dome')
method1()