反射

python面向对象中的反射: 通过字符串的形式操作对象相关属性.python中的一切都是对象(都可以使用反射)

  1.getattr(对象,'一个字符串') : 根据字符串的形式去某个对象中获取对象的成员

    - 获取类中的属性

class Foo(object):
    def __init__(self,name):
        self.name  = name
    def func(self):
        print(666)

obj = Foo('张三')

# 获取实例变量
v = getattr(obj,'name')
print(v)  # 得到结果:  张三

#获取类中的方法
getattr(obj,'func')()  # 得到结果:  666 

    - 获取当前py文件中的属性

import sys

def func():
    print(666)

name = '李四'

getattr(sys.modules['__main__'],'func')()   # 执行fanc函数,得到结果:  666

ret = getattr(sys.modules['__main__']),'name')
print(ret)  # 得到结果:  李四

    - 引用模块中的任意变量

# demo.py 文件中的属性:
def func():
     print('in func')

name = '王二麻子'

class User(object):
    def  base(self):
        print('in base')
obj = User()



# 运行脚本的文件
import demo

getattr(a,'func')()    #  in func

getattr(a,name)    # 得到结果: 王二麻子

getattr(a.User,'base')()    #得到结果:  in base

print(getattr(a,'obj')    # # 得到结果: 内存地址

   2. hasattr(对象,'一个字符串') : 根据字符串的形式去某个对象中判断是否有改成员 

class A:
    job = 'IT'
    def __init__(self):
        self.name = 'alex'
        self.age = 83
    def func(self):
        print('in func')

obj = A()

print(hasattr(obj,'sex'))    # False
print(hasattr(obj,'func'))   # True

if hasattr(obj,'func'):
    if callable(getattr(obj,'func')):     # 判断这个函数是否可被调用
        getattr(obj,'func')()    # in func

常用操作:

class User:
    lis = [('登入','login'),
           ('注册','register'),
           ('删除文件','remove'),
           ('复制文件','copy')]
    def login(self):
        print('in login')
    def register(self):
        print('in register')
    def remove(self):
        print('in remove')
    def copy(self):
        print('in copy')

obj = User()
for index,item in enumerate(obj.lis,1):
    print(index,item[0])
while True: num = input('请选择要操作的序号:') if num.isdecimal() and 0 < int(num) <= len(obj.lis): if hasattr(obj,obj.lis[int(num)-1][1]): getattr(obj,obj.lis[int(num)-1][1])() else: print('输入有误')

运行结果:

1 登入
2 注册
3 删除文件
4 复制文件
请选择要操作的序号:1
in login
请选择要操作的序号:2
in register
请选择要操作的序号:3
in remove
请选择要操作的序号:4
in copy

   3. setattr(对象,'变量','值') : 根据字符串的形式去某个对像中设置某个成员

class Foo:
    pass
obj = Foo()

obj.k1 = 999

setattr(obj,'k1',123)    # 设置实例变量中的 k1 = 123   

       
print(obj.k1)     # 打印结果:  123

   4. delattr(对象,'变量') :  根据字符串的形式去某个对象中删除成员

class Foo:
    pass

obj = Foo()

obj.k1 = 999
print(obj.k1)    # 打印结果; 999 

delattr(obj,'k1')
print(obj.k1)    # k1 的变量已经删除,运行会报错

  

原文地址:https://www.cnblogs.com/wenxin1120/p/10988934.html