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测试开发圈”,了解更多测试教程!***
python 反射的更多相关文章
- python反射
python反射 python的反射是基于字符串的形式去对象(模块)中操作其成员.此操作是动态的,常用于web开发中url参数中对应模块或者函数的反射. 下面开始具体说明: 场景需求: 我的pytho ...
- Python反射机制理解
Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员. getattr(object, name) object代表模块,name代表模块中的属性或成员,该函 ...
- 小学生绞尽脑汁也学不会的python(反射)
小学生绞尽脑汁也学不会的python(反射) 1. issubclass, type, isinstance issubclass 判断xxxx类是否是xxxx类的子类 type 给出xxx的数据类型 ...
- Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
- python反射问题
python中的__import__是以字符串的形式反射导入模块并以字符串的形式执行函数
- python 反射的使用
反射这个功能在很多编程语言中都有,在Python中自然也不例外.其实编程语言中的很多功能都能用简单的代码来验证. 在code代码之前,先简单的了解下反射的几个属性. hasattr(obj,name_ ...
- python 反射调用
因为目前在写一个python的项目,用到了Python的反射机制,所以做一下笔记,把写项目过程中的感悟记下来. 先简单介绍下Demo用到的函数: sys.path 是python的模块的路径集,是一个 ...
- python反射机制深入分析
对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...
- python反射和面向对象的知识并简述基本的异常
# 1.面向对象不是所有的情况都适用# 2.面向对象编程# a.定义类# class Foo:# def 方法1(self,bb):# b.根据类创建对象(创建) # class Person():# ...
随机推荐
- 关于对For循环嵌套优化的问题
1.案例描述 由于一次Java面试的笔试题,当时没有写出很好的解决方案,特此专门撰写一篇博客来加以记录,方便日后的查看 面试题目如下:从性能上优化如下代码并说明优化理由? for (int i = 0 ...
- HashMap源码分析
最近一直特别忙,好不容易闲下来了.准备把HashMap的知识总结一下,很久以前看过HashMap源码.一直想把集合类的知识都总结一下,加深自己的基础.我觉的java的集合类特别重要,能够深刻理解和应用 ...
- uva 11059 maximum product(水题)——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAB1QAAAMcCAIAAABo0QCJAAAgAElEQVR4nOydW7msuhKF2wIasIAHJK
- 大三那年在某宝8块钱买的.NET视频决定了我的职业生涯
前言 谨以此文献给那些还在大学中迷茫的莘莘学子们! 韩愈在<师说>中提出了作为师者应该做的三件事:传道.授业.解惑. 1.传道:培养学生的道德观 2.授业:传授学生专业技能 3.解惑:解答 ...
- 常用Linux命令
1.mkdir 建立目录 $ mkdir testdir 2.ls 列出目录下的内容的详细信息 ls -al testdir 3.cd 更换当前工作目录 cd testdir 4.pwd ...
- Spring在非web应用中关闭IoC容器 (registerShutdownHook)
在基于web的ApplicationContext实现中,已有相应的实现来处理关闭web应用时恰当地关闭Spring IoC容器.但,如果你正在一个非web应用的环境下使用Spring的IoC容器,如 ...
- Theano conv2d的border_mode
文档是这么写的: border_mode: str, int or tuple of two int Either of the following: ``'valid'``: apply filte ...
- 递推 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- ...
- iframe 跨域相互操作
我们在开发后台管理系统时可能会经常要跟 iframe 打交道,因为现在大部分后台管理系统都是页面内嵌iframe,所以有时候两者之间就难免要互相通信,但浏览器为了安全的原因,所以就禁止了不同域的访问, ...
- 搭建自己的网站之一:如何在linux下使用tomcat
1. 要打造自己的网站,首先应该有属于自己的服务器.个人的话可以在阿里云或者腾讯云购买云主机,需要的话再购买一个域名,与自己的公网ip绑定(不然只能由ip地址访问,当然,自己用来练手的话是没什么问题的 ...