对 对象的反射
hasattr(obj,'属性名/函数名')#检查是不是有
getattr(obj,'属性名/函数名')#获取属性名或函数名****对象反射得到的函数()进行调用时候不用传入对象这个参数
setattr(obj,'属性名',返回值)#设置属性使得obj.'属性名‘ = 返回值
setattr(obj,'函数名',函数:(lambda self(返回值):self.name+'sb'))#设置属性使得obj.'函数名‘ = 函数
delattr(obj,'属性')#删除对象属性
delattr(obj,'函数名')#删除对象函数
class Foo:
f = '类的静态变量'
def init(self,name,age):
self.name=name
self.age=age
def say_hi(self):
print('hi,%s'%self.name)
obj=Foo('egon',73)
#检测是否含有某属性
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))
#获取属性
n = getattr(obj,'name')
print(n)
func = getattr(obj,'say_hi')
func()
print(getattr(obj,'aaaaaaaa','不存在啊')) #报错
#设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.dict)
print(obj.show_name(obj))
#删除属性
delattr(obj,'age')
delattr(obj,'show_name')
# delattr(obj,'show_name111')#不存在,则报错
print(obj.dict)
类 的反射
getattr(Class, '属性')
getattr(Class, '方法名')
getattr(Class, '静态方法')
getattr(Class, '_Class+私有方法名')
getattr(Class, '_Class+私有属性名')
print(getattr(Foo, 'aaa')()) # 这个不明白为什么不传参数??????????????????????
#####################################################################################
class Foo(object):
staticField = "old boy"
__aaa = '2222'
def init(self):
self.name = 'wupeiqi'
def func(self):
return 'func'
@staticmethod
def bar():
return 'bar'
def __add(self):
return '__add'
@classmethod
def aaa(cls):
return 'aaa'
a = Foo()
print(getattr(Foo, 'staticField'))#属性可以反射拿到
print(getattr(Foo, '_Foo__aaa'))#属性可以反射拿到
print(getattr(Foo, 'func')(Foo))#方法可以反射拿到
print(getattr(Foo, 'bar')())# 静态方法 也可以找
print(getattr(Foo, '_Foo__add')(Foo)) #类和对象都能去调用这个类的私有方法(首先是找到私有方法)
print(getattr(Foo, 'aaa')()) # 这个不明白为什么不传参数??????????????????????
##################################################################################
import sys
def s1():
print('s1')
def s2():
print('s2')
this_module = sys.modules[name]
print(this_module)
hasattr(this_module, 's1')()
getattr(this_module, 's2')()
###########################################################