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()

 




posted on 2020-08-15 21:47  QiKa  阅读(166)  评论(0编辑  收藏  举报