您的位置:首页 > 编程语言 > Python开发

python 反射

2017-01-02 12:43 253 查看

python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!


反射的四个基本函数使用 hasattr,getattr,setattr,delattr

#!/usr/bin/python
# coding=utf-8

import sys

class Car(object):
def __init__(self, name):
self.name = name

def start(self):
print '%s start ...' % self.name

def stop(self):
print '%s stop ...' % self.name

def restart(inst):
print '%s start...' % inst.name
print '%s stop...' % inst.name

if __name__ == '__main__':
car = Car("bmw")
if hasattr(car, sys.argv[1]):  # 判断属性是否存在
func = getattr(car, sys.argv[1])  # 获取属性 car.xx()内存地址
print '%s func call >>' % sys.argv[1]
func()

print 'setattr restart:restart func call >>'
setattr(car, 'restart', restart)  # 将函数绑定到实例对象
car.restart(car)

print 'setarrt car.name >>'
print 'car name:', car.name
setattr(car, 'name', 'benz') # 修改实例对象属性值
print 'car name:', car.name

print 'delattr restart:restart func call >>'
delattr(car, 'restart')  # 删除实例对象属性
try:
car.restart(car)
except Exception, e:
print e


运行:

>>python oop_demo1.py start
start func call >>
bmw start ...
setattr restart:restart func call >>
bmw start...
bmw stop...
setarrt car.name >>
car name: bmw
car name: benz
delattr restart:restart func call >>
'Car' object has no attribute 'restart'


用反射机制实现URL路由功能

一、目录结构

└─AutoMT
│  urls.py
│  __init__.py
│
└─controller
account.py
commons.py
__init__.py


二、代码实例

controller/account.py:

#!/usr/bin/python
#coding=utf-8

def login():
print("这是一个登陆页面!")

def logout():
print("这是一个退出页面!")


controller/commons.py:

#!/usr/bin/python
#coding=utf-8

def home():
print("这是网站主页面!")


urls.py:

#!/usr/bin/python
# coding=utf-8

def run():
inp = raw_input("请输入您想访问页面的url:").strip()
try:
modules, func = inp.split("/")
try:
obj = __import__("controller." + modules, fromlist=True)  # 根据参数,动态的导入同名的模块,注意fromlist参数
if hasattr(obj, func):
func = getattr(obj, func)
func()
else:
print '404'
except ImportError, e:
print e

except ValueError:
print 'url不合规则,要求格式:controller/func'

if __name__ == '__main__':
while True:
run()


运行结果:

>>python urls.py
请输入您想访问页面的url:account/login
这是一个登陆页面!

请输入您想访问页面的url:commons/home
这是网站主页面!

请输入您想访问页面的url:account/register
404

请输入您想访问页面的url:houtai/home
No module named houtai

请输入您想访问页面的url:


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: