反射
什么是反射?
通过字符串的形式操作对象相关属性。python中的事物都是对象;
关键方法:
(1)getattr:获取属性
(2)setattr:设置属性
(3)hashattr:检测是否含有属性,返回布尔值
(4)delattr:删除属性
具体功能演示:
classFoo:
f= '类对静态变量'def __init__(self, name, age):
self.name=name
self.age=agedefsay_hi(self):print('hi, %s' %self.name)
obj= Foo('xiaofei', 20)#检测是否含有某属性
print(hasattr(obj, 'name'))print(hasattr(obj, 'say_hi'))#执行结果:#True#True
print('--------------------------------------')#获取属性:
print(getattr(obj, 'name'))
func= getattr(obj, 'say_hi')
func()print(getattr(obj, 'aaaaa', '不存在!'))#执行结果:#xiaofei#hi, xiaofei#不存在!
print('--------------------------------------')#设置属性
setattr(obj,'gender', 'female')
setattr(obj,'show_name', lambda self: self.name + 'er')print(obj.gender)print(obj.show_name(obj))#执行结果:#female#xiaofeier
print('--------------------------------------')#删除属性
delattr(obj, 'age')
delattr(obj,'show_name')print(obj.__dict__)#执行结果:#{'gender': 'female', 'name': 'xiaofei'}
delattr(obj,'aaaa') #删除不存在对属性,会报错
实例中的用法:importosclassManage_cmd(object):defrun(self):whileTrue:
cmd= input('>>>').strip()if not cmd: continueifhasattr(self, cmd):
func=getattr(self, cmd)
func()else:print('-bash: %s: command not found' %cmd)defls(self):print(os.listdir('.'))
cmd=Manage_cmd()
cmd.run()#执行结果:#>>>ls#['test1.py']#>>>asdfadf#-bash: asdfadf: command not found
反射功能演示代码
1. 反射不仅仅只能用在属性上,也可以用在方法上
classFoo(object):
staticField= 'hello world.'def __init__(self):
self.name= 'hkey'deftest(self):return 'test'@staticmethoddefbar():return 'bar'
print(getattr(Foo, 'staticField'))print(getattr(Foo, 'test'))
func= getattr(Foo, 'bar')print(func())#执行结果:#hello world.##bar
反射类的方法
2. 反射当前文件(模块)成员
importsysdefs1():print('s1')defs2():print('s2')
this_module= sys.modules[__name__]print(hasattr(this_module, 's1'))
func= getattr(this_module, 's2')
func()#执行结果:#True#s2
反射当前py文件的函数
3. 导入其他模块,利用反射查找该模块是否存在某个方法
module_test.py#!/usr/bin/python3#-*- coding: utf-8 -*-#Author: hkey
deftest():print('form the test.')
test1.py'''程序目录:
module_test.py
test1.py
当前文件:
test1.py'''
importmodule_test as objif hasattr(obj, 'test'):
func= getattr(obj, 'test')
func()#执行结果:#form the test.
利用反射导入另一个文件的函数及方法
item 系列
关键方法:
__getitem__:如果在类中定义了__getitem__()方法,那么就可以通过dict的形式,P[key]取值,当实例对象作P[key]运算时,就会调用类中的__getitem__()方法;
classStudent(object):def __init__(self, name):
self.name=namedef __getitem__(self, item):print(self.__dict__[item])
s= Student('hkey')
s.age= 20s['name']
s['age']#执行结果:#hkey#20
__getitem__演示代码
__setitem__:如果在类中定义了__setitem__()方法,那么就可以通过dict的形式添加属性和方法;
classStudent(object):def __init__(self, name):
self.name=namedef __setitem__(self, key, value):
self.__dict__[key] =valuedef __getitem__(self, item):print(self.__dict__[item])
s= Student('hkey')#调用类的__setitem__方法,通过dict的形式进行添加对象的属性
s['age'] = 20s['hobby'] = 'coding'
#调用类的__getitem__方法,通过dict的形式获取对象的属性
s['age']
s['hobby']#执行结果:#20
__setitem__演示代码
__delitem__:通过dict的形式,删除对象的属性或方法
classStudent(object):def __init__(self, name):
self.name=namedef __getitem__(self, item):return self.__dict__[item]def __delitem__(self, key):
self.__dict__.pop(key)print('执行我了。')
s= Student('hkey')
s.age= 20
print(s['name'])print(s['age'])del s['age']#执行结果:#hkey#20#执行我了。
__delitem__演示代码