python 反射

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:

  

 


***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***
posted @ 2017-01-02 12:43  鲨鱼逛大街  阅读(247)  评论(0编辑  收藏  举报