反射功能:***attr
python 面向对象中的反射:通过字符串的形式操作对象相关的属性。Python中的一切事物都是对象(都可以使用反射)
python中反射功能是由四个内置函数提供:hasattr, getattr, setattr, delattr
该四个函数分别用于对 对象内部执行:检查是否含有成员,获取成员,设置成员,删除成员。
class Foo(object): def __init__(self): self.name = 'tom' def func(self): return 'func123' obj = Foo() #-------检查是否含有成员 hasattr(obj,'name') #print ---> True hasattr(obj,'func') #True #-------获取成员 getattr(obj,'name') getattr(obj,'func') #-------设置成员 setattr(obj,'age',20) setattr(obj,'show',lambda num:num + 1) # print(obj.age) #20 # print(obj.show(2)) #3 #-------删除成员 delattr(obj,'name') delattr(obj,'func') # print(obj.name) #报属性错误 # print(obj.func()) #报属性错误
详细解析:
class Foo(object): role = '地球人' def __init__(self, name): self.name = name def func(self): return 'func123' obj = Foo('Tom') obj2 = Foo('jack') print(obj.name) print(obj2.name) print(obj.func())
解析开始:
class Foo(object): def __init__(self): self.name = '汤姆' def func(self): return 'func123' obj = Foo() #访问字段 obj.name #执行方法 obj.func()
a.上述访问对象成员的 name 和 func 是什么?
答:是变量名
b. obj.xxx是什么意思?
答:obj.xxx 表示去obj中或类中寻找 变量名xxx, 并获取对应内存地址中的内容。
c.需求:使用其他方式获取obj对象中的name变量指向 内存中的值“汤姆”
***** 不允许使用 obj.name
答:两种方式
class Foo(object): def __init__(self): self.name = '汤姆' def func(self): return 'func123' obj = Foo() print(obj.__dict__['name'])
class Foo(object): def __init__(self): self.name = '汤姆' def func(self): return 'func123' obj = Foo() print(getattr(obj,'name'))
from wsgiref.simple_server import make_server class Handler(object): def index(self): return 'index' def news(self): return 'news' def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) url = environ['PATH_INFO'] temp = url.split('/')[1] obj = Handler() is_exist = hasattr(obj, temp) if is_exist: func = getattr(obj, temp) ret = func() return ret else: return '404 not found' if __name__ == '__main__': httpd = make_server('', 8001, RunServer) print "Serving HTTP on port 8000..." httpd.serve_forever()
结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
import sys def s1(): print('s1') def s2(): print('s2') this_module = sys.modules[__name__] print(hasattr(this_module,'s1')) #True print(hasattr(this_module,'s2')) #True
类也是对象
class Foo(object): role = '地球人' def __init__(self): self.name = 'Tom' def func(self): return 'func' @staticmethod def bar(): return 'bar' print(getattr(Foo,'role')) print(getattr(Foo,'func')) print(getattr(Foo,'bar'))
模块也是对象
home.py
def to_im(): return 'To be imported'
""" 程序目录: home.py index.py 当前文件: index.py """ import home as obj #print(obj.to_im()) func = getattr(obj,'to_im') func()