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测试开发圈”,了解更多测试教程!***

python 反射的更多相关文章

  1. python反射

    python反射 python的反射是基于字符串的形式去对象(模块)中操作其成员.此操作是动态的,常用于web开发中url参数中对应模块或者函数的反射. 下面开始具体说明: 场景需求: 我的pytho ...

  2. Python反射机制理解

    Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员. getattr(object, name) object代表模块,name代表模块中的属性或成员,该函 ...

  3. 小学生绞尽脑汁也学不会的python(反射)

    小学生绞尽脑汁也学不会的python(反射) 1. issubclass, type, isinstance issubclass 判断xxxx类是否是xxxx类的子类 type 给出xxx的数据类型 ...

  4. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  5. python反射问题

    python中的__import__是以字符串的形式反射导入模块并以字符串的形式执行函数

  6. python 反射的使用

    反射这个功能在很多编程语言中都有,在Python中自然也不例外.其实编程语言中的很多功能都能用简单的代码来验证. 在code代码之前,先简单的了解下反射的几个属性. hasattr(obj,name_ ...

  7. python 反射调用

    因为目前在写一个python的项目,用到了Python的反射机制,所以做一下笔记,把写项目过程中的感悟记下来. 先简单介绍下Demo用到的函数: sys.path 是python的模块的路径集,是一个 ...

  8. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  9. python反射和面向对象的知识并简述基本的异常

    # 1.面向对象不是所有的情况都适用# 2.面向对象编程# a.定义类# class Foo:# def 方法1(self,bb):# b.根据类创建对象(创建) # class Person():# ...

随机推荐

  1. 关于对For循环嵌套优化的问题

    1.案例描述 由于一次Java面试的笔试题,当时没有写出很好的解决方案,特此专门撰写一篇博客来加以记录,方便日后的查看 面试题目如下:从性能上优化如下代码并说明优化理由? for (int i = 0 ...

  2. HashMap源码分析

    最近一直特别忙,好不容易闲下来了.准备把HashMap的知识总结一下,很久以前看过HashMap源码.一直想把集合类的知识都总结一下,加深自己的基础.我觉的java的集合类特别重要,能够深刻理解和应用 ...

  3. uva 11059 maximum product(水题)——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAB1QAAAMcCAIAAABo0QCJAAAgAElEQVR4nOydW7msuhKF2wIasIAHJK

  4. 大三那年在某宝8块钱买的.NET视频决定了我的职业生涯

    前言 谨以此文献给那些还在大学中迷茫的莘莘学子们! 韩愈在<师说>中提出了作为师者应该做的三件事:传道.授业.解惑. 1.传道:培养学生的道德观 2.授业:传授学生专业技能 3.解惑:解答 ...

  5. 常用Linux命令

    1.mkdir 建立目录 $ mkdir testdir 2.ls   列出目录下的内容的详细信息  ls -al testdir 3.cd  更换当前工作目录   cd testdir 4.pwd  ...

  6. Spring在非web应用中关闭IoC容器 (registerShutdownHook)

    在基于web的ApplicationContext实现中,已有相应的实现来处理关闭web应用时恰当地关闭Spring IoC容器.但,如果你正在一个非web应用的环境下使用Spring的IoC容器,如 ...

  7. Theano conv2d的border_mode

    文档是这么写的: border_mode: str, int or tuple of two int Either of the following: ``'valid'``: apply filte ...

  8. 递推 hdu 2064

    z[n] n个盘子从1到3次数 先想2个的时候  1->2 2->3  1->2 3->2 2->1 2->3 1->2 2->3 显然 要先把上面n- ...

  9. iframe 跨域相互操作

    我们在开发后台管理系统时可能会经常要跟 iframe 打交道,因为现在大部分后台管理系统都是页面内嵌iframe,所以有时候两者之间就难免要互相通信,但浏览器为了安全的原因,所以就禁止了不同域的访问, ...

  10. 搭建自己的网站之一:如何在linux下使用tomcat

    1. 要打造自己的网站,首先应该有属于自己的服务器.个人的话可以在阿里云或者腾讯云购买云主机,需要的话再购买一个域名,与自己的公网ip绑定(不然只能由ip地址访问,当然,自己用来练手的话是没什么问题的 ...