python反射

概念

运行时: 区别于编译时,指程序被加载到内存中执行的时候.

反射(自省): 指运行时获取对象的类型信息.

具有反射能力的函数:type(), isinstance(), getattr()等.

作用: 通过字符串映射或修改程序(内存)运行时的状态、属性、方法.

注意:对实例动态添加属性时(setattr方法),注意该添加的方法不会绑定实例(使用时,相当于普通函数调用,参数需要填入).所以应该将方法添加到类对象中,而非该类对象的实例.


语法

a)  hasattr(object,name)

判断对象里是否有相应字符串的方法。如read里 输入run方法。

print(hasattr(h, read))

b)  getattr(object,name,default=None)

获取字符串里的对象方法内存地址

print(getattr(h, read))# 映射对象的方法所在的内存地址

print(getattr(h, read)())# 加()执行对象方法

c)  setattr(obj.name,value)

为对象创建新的方法(或将类之外的方法、属性添加到类中)

obj.name = value

d)  delattr(x,y)

删除对象中的方法


例:利用反射使函数解耦

class New(object):

    def __init__(self):

        pass

    def input(self):

        while True:

            inp = input('>>> ')

            cmd = inp.split()[0]

            if hasattr(self,cmd):

                func = getattr(self,cmd)

                func(cmd)

            else:

                print('{new} is not exist' .format(new=cmd))

                continue

    def inter(self,*args):

        x = args[0]

        print(x)

a1 = New()

a1.input()

例:利用反射,执行模块方法

# 编写test2.py文件

def add():

   print('add')

def del_1():

   print('del')

def fetch():

   print('fetch')

# 编写test1.py文件

import test2

list1 = [

   {'cap':'add user', 'func':'add'},

   {'cap':'del uesr', 'func':'del_1'},

   {'cap':'search user', 'func':'fetch'}

]

for index, item in enumerate(list1, 1):

   print(index, item['cap'])

def ch():

   choice = input('input num above menu: ')

   choice = int(choice)

   if choice in range(1,4):

       func_name = list1[choice-1]['func']

       func = getattr(test2, func_name)

       func()

   else:

       print('error! out of range!')

       return ch()

if __name__ == '__main__':

   ch()

你可能感兴趣的:(python反射)