0
点赞
收藏
分享

微信扫一扫

python的反射

python反射
发射就是通过字符串的形式导入模块,通过字符串的形式去模块中寻找指定的函数并执行。

4个内置函数:
getattr(strObject, attr [,default])    
返回指定字符串strObject的属性或方法'attr',如果有属性则返回该属性的值,
如果有方法则返回该方法的内存地址,如果都没有报错。
如果指定了默认值且都没有,则返回该默认值。

hasattr(strObject, attr)
判断指定字符串strObject对象是否有该属性或方法'attr',返回True/False

setattr(strObject, attr, value)
为指定字符串strObject对象设置属性attr的值,如果对象已有尬属性的值则修改原值,
如果没有该属性则新增属性并赋值

delattr(strObject, attr)
删除指定字符串strObject对象的属性attr,如果没有该属性则报错。


举例:

#coding=utf-8

class Demo:
    def __init__(self,name):
        self.name=name

    def func(self):
        pass


d=Demo('Vince')

#getattr用法
print(getattr(d,'name'))
#结果:Vince,获取该对象 d 的属性name的值

print(getattr(d,'func'))
'''
结果:<bound method Demo.func of <__main__.Demo object at 0x000002CC3698C070>>
获取该对象 d 的方法func的内存地址
'''


#setattr用法
setattr(d,'name','Tom')
print(getattr(d,'name'))
'''
结果:Tom
先设置对象d的属性name的值,因为已经存在故修改原属性值为Tom
'''

setattr(d,'age',18)
print(getattr(d,'age'))
'''
结果:18
设置对象d的属性age的值,因为没有该age属性,故新增该age属性并赋值
'''



#hasattr用法
print(hasattr(d,'age'))
'''
结果:True
判断对象d是否有属性age
'''

print(hasattr(d,'func'))
'''
结果:True
判断对象d是否有方法func
'''



#delattr用法
delattr(d,'age')
print(hasattr(d,'age'))
'''
结果:False
先删除对象d的属性age,再判断对象d是否还有属性age
注:删除只能删除属性,不能删除方法
'''

本模块的反射实用

#coding-utf-8
import sys

aa=11

def func(avg):
    print(avg)
    print('Bingo')


print(sys.modules[__name__])
print(type(sys.modules[__name__]))
'''
获取本模块的名称对象地址
<module '__main__' from 'E:/HDCZU_Test/pymoo反射/py02.py'>
<class 'module'>
'''


print(getattr(sys.modules[__name__], 'aa'))
'''
结果:11
获取本模块对象的属性aa的值
'''

f=getattr(sys.modules[__name__], 'func')
f(100)
'''
结果:
100
Bingo
获取本模块对象的方法func的内存地址即f也指向该方法了,故可以方法调用
'''

导入模块的反射实用

#py03.py文件
#coding=utf-8

a=1
def demo(avg):
    print(avg)
    return 'Bingo'



#py04.py文件
#coding=utf-8

from pymoo反射 import py03

print(getattr(py03,'a'))
'''
结果:1
获取指定模块py03的属性a的值
'''

f=getattr(py03,'demo')
res=f(100)
print(res)
'''
100
Bingo
先获取指定模块py03的方法地址赋值给f,即f也是一个函数对象了,
再调用该f函数
'''
举报

相关推荐

0 条评论