本节内容

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))
 
= 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))
 
= 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))
 
= 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)
 
#输出
>>>:talk
shabi 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))
 
= Dog("shabi")
choice = input(">>>:").strip()
 
setattr(d,choice,22)  #输入的是age,所以又等同于d.age = 22
# print(d.age) 这样就写死了,还是用下面一种
print(getattr(d,choice))
 
#输出
>>>:age
22

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】:反射的最佳实践(三)的更多相关文章

  1. nodejs 实践:express 最佳实践(三) express 解析

    nodejs 实践:express 最佳实践(三) express 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固, ...

  2. nodejs 实践:express 最佳实践系列

    nodejs 实践:express 最佳实践系列 nodejs 实践:express 最佳实践(一) 项目结构 nodejs 实践:express 最佳实践(二) 中间件 nodejs 实践:expr ...

  3. Mysql索引最佳实践笔记0524

    #mysql5.7 innodb默认存储引擎 一.关于索引二.最佳实践三.避坑实践 一.关于索引 1.索引的作用 -提高查询效率 -数据分组.排序 -避免回表查询 -优化聚集查询 -用于多表join关 ...

  4. Google Developing for Android 三 - Performance最佳实践

    Google Developing for Android 三 - Performance最佳实践 发表于 2015-06-07   |   分类于 Android最佳实践 原文 Developing ...

  5. 总结 React 组件的三种写法 及最佳实践 [涨经验]

    React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...

  6. 给HTML初学者的三十条最佳实践

    Nettuts +运营最困难的方面是为很多技能水平不同的用户提供服务.如果我们发布太多高级教程,我的新手用户将无法从中受益.相反也是如此.我们尽我们最大的努力,但如果你觉得你被忽略了请联系我们.这个网 ...

  7. 总结 React 组件的三种写法 及最佳实践

    React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...

  8. DHCP最佳实践(三)

    这是Windows DHCP最佳实践和技巧的最终指南. 如果您有任何最佳做法或技巧,请在下面的评论中发布它们. 在本指南(三)中,我将分享以下DHCP最佳实践和技巧. 仅在需要时才使用IP冲突检测 运 ...

  9. 【GoLang】golang 最佳实践汇总

    最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...

随机推荐

  1. java 五子棋游戏

    五子棋游戏 一,1.五子棋的基本常识 与任何一种竞技棋一样,五子棋的每一局棋也分为三个阶段:开局,中局和残局. 五子棋的开始阶段称为开局,或称布局.其开局阶段是十分短暂的,大约在七着与十几着之间.在这 ...

  2. Oracle系列(一): Oracle数据恢复

     Oracle数据恢复 在使用Oracle的时候,突然一部小心update或者delete全部数据后怎么办? select * from table as of timestamp to_timest ...

  3. jsp的自定义标签

    1.相对于JSTL或Spring等第三方标签库而言的,用来实现项目中特定的功能需求. 2.自定义标签基本的组成部分 ①页面上看得见的部分 [1]通过taglib引入标签库 [2]标签本身 ②xxx.t ...

  4. iOS GCD中级篇 - dispatch_semaphore(信号量)的理解及使用

    理解这个概念之前,先抛出一个问题 问题描述: 假设现在系统有两个空闲资源可以被利用,但同一时间却有三个线程要进行访问,这种情况下,该如何处理呢? 或者 我们要下载很多图片,并发异步进行,每个下载都会开 ...

  5. 定义类型别名(typedef,using)

    说到类型别名,无非是给类型名(如int,char,float,double,bool)取一个比较有特殊含义的名字而已 最常用的关键莫过于 typedef 吧 typedef最常见的用法是与结构体str ...

  6. MySQL基础~~增、删、改、简单查

    mysql> desc demo; +-----------+------------+------+-----+---------+----------------+ | Field | Ty ...

  7. ngnix使用超时响应时间配置避坑一例

    ngnix的超时响应时间配置得比tomcat的spring mvc响应时间还小,悲剧就发生了,生产环境还不易发现. 就好比定制固定木柜没考虑进门的尺寸,横竖斜都进不去,太悲剧了.哈哈哈,以此为鉴!~

  8. 修改VCL源码实现自定义输入对话框

    来自:https://yq.aliyun.com/wenji/88428 通过修改VCL源码实现自定义输入对话框 在BCB中有两个函数可以实现输入对话框:InputBox和InputQuery,其实I ...

  9. Lodop代码设置打印机等信息后 设置预览可重选

    Lodop打印控件默认在代码里指定了打印.纸张.纸张方向.份数等信息,在预览的界面的设置里是无法重新选择的,默认是禁止重选的,如果重选会提示,例如:“打印方向”已由程序控制,无法改变!“纸张大小”已由 ...

  10. QueryParser 是对一段话进行分词的 用于收集客户端发来的