面向对象【day08】:反射的最佳实践(三)
本节内容
1、伪造web框架的路由系统
2、反射函数
3、扩展导入模块
4、企业最佳实践
一、伪造web框架的路由系统

commons.py
#!/usr/bin/env python
# -*- coding: utf-8 -*- def login():
print('炫酷登录页面') def logout():
print('炫酷退出页面') def home():
print('炫酷主页面')
index.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import conmmons def run():
inp = input('请输入要访问的url')
# inp 字符串类型 inp="login"
# commons inp() #commons.login
# 利用字符串的形式去对象(模块)中操作(寻找/检查)成员 if hasattr(commons, inp):
func = getattr(commons, inp)
func()
else:
print('404') if __name__ == '__main__':
run()
基于字符串的形式去对象(模块)中操作其成员

manager.py
#!/usr/bin/env python
# -*- coding: utf-8 -*- def order():
print('炫酷的当单页面')
account.py
#!/usr/bin/env python
# -*- coding: utf-8 -*- def login():
print('炫酷登录页面') def logout():
print('炫酷退出页面')
commons.py
#!/usr/bin/env python
# -*- coding: utf-8 -*- def home():
print('炫酷主页面')
index.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import conmmons def run():
inp = input('请输入要访问的url')
# inp 字符串类型 inp="login"
# commons inp() #commons.login
# 利用字符串的形式去对象(模块)中操作(寻找/检查/删除、设置)成员,反射
m, f = inp.split('/')
obj = __import__(m)
if hasattr(obj, f):
func = getattr(obj, f)
func()
else:
print('404')
if __name__ == '__main__':
run()
tornado框架中的应用

tornado程序源码逻辑图
二、反射函数
2.1、hasarttr(obj,name_str)
作用:判断一个对象obj中是否有对应的name_str字符串的属性或者方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print("{0} is eating...{1}".format(self.name,food))d = Dog("shabi")choice = input(">>>:").strip()print(hasattr(d,choice)) #obj中是否有对应的choice字符串的属性或者方法#输出>>>:name #输入对象存在属性True>>>:eat #输入对象存在的方法True |
2.2、getattr(obj,name_str)
作用:根据字符串name_str获取obj对象中的对应方法的内存地址或者对应属性的值
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print("{0} is eating...{1}".format(self.name,food))d = Dog("shabi")choice = input(">>>:").strip()print(getattr(d,choice)) #choice获取obj对象中的对应方法的内存地址或者对应属性的值#输出>>>:name #返回name属性的值shabi>>>:eat<bound method Dog.eat of <__main__.Dog object at 0x00000157A129CF28>> #返回eat方法的内存地址 |
2.3、setattr(x,y,z)
作用:给obj对象添加一个新属性或者新方法,setattr(x, 'y', v) is equivalent to ``x.y = v''
①给对象新增一个新方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
def bulk(self): #先定义一个bulk函数 print("{0} is yelling...".format(self.name))class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print("{0} is eating...{1}".format(self.name,food))d = Dog("shabi")choice = input(">>>:").strip()setattr(d,choice,bulk) #输入的是talk,所以又等同于d.talk = bulk#d.talk(d) 直接写死,用d.talk(d),一般不这么写func = getattr(d,choice) #用getattr来获取func(d)#输出>>>:talkshabi is yelling... |
②给对象新增一个属性
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print("{0} is eating...{1}".format(self.name,food))d = Dog("shabi")choice = input(">>>:").strip()setattr(d,choice,22) #输入的是age,所以又等同于d.age = 22# print(d.age) 这样就写死了,还是用下面一种print(getattr(d,choice))#输出>>>:age22 |
2.4、delattr(x,y)
作用:删除obj对象中的属性或者方法,delattr(x, 'y') is equivalent to ``del x.y''
三、扩展:导入模块

index.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import conmmons def run():
inp = input('请输入要访问的url')
# inp 字符串类型 inp="login"
# commons inp() #commons.login
# 利用字符串的形式去对象(模块)中操作(寻找/检查/删除、设置)成员,反射 m, f = inp.split('/')
#import lib.account
obj = __import__("lib."+m, fromlist=True)
if hasattr(obj, f):
func = getattr(obj, f)
func()
else:
print('404') if __name__ == '__main__':
run()
四、企业最佳实践
import xxx
from xxx import ooo
obj = __import__("xxx")
obj = __import__("xxx.oo.xxx",fromlist=True)
面向对象【day08】:反射的最佳实践(三)的更多相关文章
- nodejs 实践:express 最佳实践(三) express 解析
nodejs 实践:express 最佳实践(三) express 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固, ...
- nodejs 实践:express 最佳实践系列
nodejs 实践:express 最佳实践系列 nodejs 实践:express 最佳实践(一) 项目结构 nodejs 实践:express 最佳实践(二) 中间件 nodejs 实践:expr ...
- Mysql索引最佳实践笔记0524
#mysql5.7 innodb默认存储引擎 一.关于索引二.最佳实践三.避坑实践 一.关于索引 1.索引的作用 -提高查询效率 -数据分组.排序 -避免回表查询 -优化聚集查询 -用于多表join关 ...
- Google Developing for Android 三 - Performance最佳实践
Google Developing for Android 三 - Performance最佳实践 发表于 2015-06-07 | 分类于 Android最佳实践 原文 Developing ...
- 总结 React 组件的三种写法 及最佳实践 [涨经验]
React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...
- 给HTML初学者的三十条最佳实践
Nettuts +运营最困难的方面是为很多技能水平不同的用户提供服务.如果我们发布太多高级教程,我的新手用户将无法从中受益.相反也是如此.我们尽我们最大的努力,但如果你觉得你被忽略了请联系我们.这个网 ...
- 总结 React 组件的三种写法 及最佳实践
React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...
- DHCP最佳实践(三)
这是Windows DHCP最佳实践和技巧的最终指南. 如果您有任何最佳做法或技巧,请在下面的评论中发布它们. 在本指南(三)中,我将分享以下DHCP最佳实践和技巧. 仅在需要时才使用IP冲突检测 运 ...
- 【GoLang】golang 最佳实践汇总
最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...
随机推荐
- PHP 4种输出的方式
<?php //测试用的数组 $info = array('11'=>'aaa', '22'=>'bbb', '33'=>'ccc'); //第一种,将整个数组作为一个对象输出 ...
- 关于flask自带web应用服务器Werkzeug 使用requests请求时出现的错误。
先说明一下当时的情况,下午遇到一个需求需要先从jd那边拿到图片然后上传到本地的cdn服务器来获取对应的ident 和地址. 于是就需要首先拿到京东的图片url,然后按照图片url去请求图片到内存然后再 ...
- Delphi导出数据的多种方法
//Dxdbgrid,则直接用SaveToexcel即可//使用 ExcelWithOdbc 控件function TDataModule1.GetDataToFile(DsData: TObject ...
- indicator function指示函数
指示函数 在集合论中,指示函数是定义在某集合X上的函数,表示其中有哪些元素属于某一子集A. 中文名 指示函数 外文名 indicator function 相关学科 数学.组合数学 其他称呼 特征 ...
- 学习笔记12之通过ajax动态添加选项
- BZOJ4516 SDOI2016生成魔咒(后缀数组+平衡树)
一个字符串本质不同的子串数量显然是总子串数减去所有height值.如果一个个往里加字符的话,每次都会改动所有后缀完全没法做.但发现如果从后往前加的话,每次只会添加一个后缀.于是我们把字符串倒过来,每次 ...
- mysql Packet for query is too large (2036 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
解决方法: 打开控制台,输入下面语句,执行 set global max_allowed_packet = 20*1024*1024; 网上说要重启 mysql server, 我是执行完后不用重启就 ...
- java 按概率产生
import java.util.Random; import org.junit.Test; public class Demo1 { public void getChance(int perce ...
- git pull报“unable to update local ref”解决方案
使用git pull拉取代码的时候,无法拉取最新代码,报"unable to update local ref"错误. 除了重新clone一份代码外,还可以使用如下解决方案: 1. ...
- 分别用postman和python做post请求接口功能测试
前几天,在做一个post请求的接口功能测试的时候,发现数据始终无法入库, 认真加仔细检查了请求的url.方式.参数,均没有问题 找到技术确认,原来是需要传json格式数据 在头信息中加上类型,body ...
