python----------反射和设计模式
反射:
把字符串映动态射成对象内存地址。
hasattr():判断一个对象里是否有对应的字符串的方法
getattr():根据字符串去获取obj对象里的对应方法的内存地址。
- class Dog(object):
- def __init__(self,name):
- self.name = name
- def eat(self):
- print('%s is eating...',self.name)
- d = Dog('NiuHanYang')
- choice = input('>>:').strip() # choice是字符串,不能直接调用,使用反射
- print(hasattr(d,choice))
print(getattr(d,choice)) # 得到的内存地址
getattr(d,choice)() # 调用eat方法- if hasattr(d,choice):
func = getattr(d,choice)
func('chenRonghua')
setattr(): is equivalent to 'x.y =v'
- def bulk(self):
- print('%s is yelling...' %self.name)
- class Dog(object):
- def __init__(self,name):
- self.name = name
- def eat(self,food):
- print('%s is eating...'%self.name,food)
- d=Dog('NiuHanYang')
- choice = input('>>:').strip()
- if hasattr(d,choice):
- func = getattr(d,choice)
- func('chenRonghua')
- else:
- setattr(d,choice,bulk)
- d.talk(d)
- >>:talk
- NiuHanYang is yelling...
动态装方法:
- def bulk(self):
- print('%s is yelling...' %self.name)
- class Dog(object):
- def __init__(self,name):
- self.name = name
- def eat(self,food):
- print('%s is eating...'%self.name,food)
- d=Dog('NiuHanYang')
- choice = input('>>:').strip()
- if hasattr(d,choice):
- func = getattr(d,choice)
- func('chenRonghua')
- else:
- # setattr(d,choice,bulk)
- # d.talk(d)
- setattr(d,choice,22)
- print(getattr(d,choice))
- >>:ff
- 22
delattr(对象,名字):直接名字对象。
- class Foo(object):
- def __init__(self):
- self.name = 'wupeiqi'
- def func(self):
- return 'func'
- obj = Foo()
- print(hasattr(obj,'name'))
- print(hasattr(obj,'func'))
- print(getattr(obj,'name'))
- print(getattr(obj,'func'))
- print(setattr(obj,'age',18))
- print(setattr(obj,'show',lambda num:num+1))
- # #### 删除成员 ####
- delattr(obj, 'name')
- delattr(obj, 'func')
详细解析:
当我们要访问一个对象的成员时,应该是这样操作:
- class Foo(object):
- def __init__(self):
- self.name = 'alex'
- def func(self):
- return 'func'
- obj = Foo()
- # 访问字段
- obj.name
- # 执行方法
- obj.func()
- lass Foo(object):
- def __init__(self):
- self.name = 'alex'
- # 不允许使用 obj.name
- obj = Foo()
答:有两种方式,如下:
- class Foo(object):
- def __init__(self):
- self.name = 'alex'
- def func(self):
- return 'func'
- # 不允许使用 obj.name
- obj = Foo()
- print obj.__dict__['name']
方式一
- class Foo(object):
- def __init__(self):
- self.name = 'alex'
- def func(self):
- return 'func'
- # 不允许使用 obj.name
- obj = Foo()
- print getattr(obj, 'name')
方式二
d、比较三种访问方式
- obj.name
- obj.__dict__['name']
- getattr(obj, 'name')
答:第一种和其他种比,...
第二种和第三种比,...
- #!/usr/bin/env python
- #coding:utf-8
- from wsgiref.simple_server import make_server
- class Handler(object):
- def index(self):
- return 'index'
- def news(self):
- return 'news'
- def RunServer(environ, start_response):
- start_response('200 OK', [('Content-Type', 'text/html')])
- url = environ['PATH_INFO']
- temp = url.split('/')[1]
- obj = Handler()
- is_exist = hasattr(obj, temp)
- if is_exist:
- func = getattr(obj, temp)
- ret = func()
- return ret
- else:
- return '404 not found'
- if __name__ == '__main__':
- httpd = make_server('', 8001, RunServer)
- print "Serving HTTP on port 8000..."
- httpd.serve_forever()
结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
设计模式:
一、单例模式
单例,顾名思义单个实例。
- 学习单例之前,首先来回顾下面向对象的内容:
- python的面向对象由两个非常重要的两个“东西”组成:类、实例
- 面向对象场景一:
- 如:创建三个游戏人物,分别是:
- 苍井井,女,18,初始战斗力1000
- 东尼木木,男,20,初始战斗力1800
- 波多多,女,19,初始战斗力2500
- # ##################### 定义类 #####################
- class Person:
- def __init__(self, na, gen, age, fig):
- self.name = na
- self.gender = gen
- self.age = age
- self.fight =fig
- def grassland(self):
- """注释:草丛战斗,消耗200战斗力"""
- self.fight = self.fight - 200
- # ##################### 创建实例 #####################
- cang = Person('苍井井', '女', 18, 1000) # 创建苍井井角色
- dong = Person('东尼木木', '男', 20, 1800) # 创建东尼木木角色
- bo = Person('波多多', '女', 19, 2500) # 创建波多多角色
面向对象场景二:
如:创建对数据库操作的公共类
- 增
- 删
- 改
- 查
- # #### 定义类 ####
- class DbHelper(object):
- def __init__(self):
- self.hostname = '1.1.1.1'
- self.port = 3306
- self.password = 'pwd'
- self.username = 'root'
- def fetch(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- pass
- def create(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- pass
- def remove(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- pass
- def modify(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- pass
- # #### 操作类 ####
- db = DbHelper()
- db.create()
实例:结合场景二实现Web应用程序
- #!/usr/bin/env python
- #coding:utf-8
- from wsgiref.simple_server import make_server
- class DbHelper(object):
- def __init__(self):
- self.hostname = '1.1.1.1'
- self.port = 3306
- self.password = 'pwd'
- self.username = 'root'
- def fetch(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- return 'fetch'
- def create(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- return 'create'
- def remove(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- return 'remove'
- def modify(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- return 'modify'
- class Handler(object):
- def index(self):
- # 创建对象
- db = DbHelper()
- db.fetch()
- return 'index'
- def news(self):
- return 'news'
- def RunServer(environ, start_response):
- start_response('200 OK', [('Content-Type', 'text/html')])
- url = environ['PATH_INFO']
- temp = url.split('/')[1]
- obj = Handler()
- is_exist = hasattr(obj, temp)
- if is_exist:
- func = getattr(obj, temp)
- ret = func()
- return ret
- else:
- return '404 not found'
- if __name__ == '__main__':
- httpd = make_server('', 8001, RunServer)
- print "Serving HTTP on port 8001..."
- httpd.serve_forever()
对于上述实例,每个请求到来,都需要在内存里创建一个实例,再通过该实例执行指定的方法。
那么问题来了...如果并发量大的话,内存里就会存在非常多功能上一模一样的对象。存在这些对象肯定会消耗内存,对于这些功能相同的对象可以在内存中仅创建一个,需要时都去调用,也是极好的!!!
铛铛 铛铛 铛铛铛铛铛,单例模式出马,单例模式用来保证内存中仅存在一个实例!!!
通过面向对象的特性,构造出单例模式:
- # ########### 单例类定义 ###########
- class Foo(object):
- __instance = None
- @staticmethod
- def singleton():
- if Foo.__instance:
- return Foo.__instance
- else:
- Foo.__instance = Foo()
- return Foo.__instance
- # ########### 获取实例 ###########
- obj = Foo.singleton()
对于Python单例模式,创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.singleton() 。
- #!/usr/bin/env python
- #coding:utf-8
- from wsgiref.simple_server import make_server
- # ########### 单例类定义 ###########
- class DbHelper(object):
- __instance = None
- def __init__(self):
- self.hostname = '1.1.1.1'
- self.port = 3306
- self.password = 'pwd'
- self.username = 'root'
- @staticmethod
- def singleton():
- if DbHelper.__instance:
- return DbHelper.__instance
- else:
- DbHelper.__instance = DbHelper()
- return DbHelper.__instance
- def fetch(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- pass
- def create(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- pass
- def remove(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- pass
- def modify(self):
- # 连接数据库
- # 拼接sql语句
- # 操作
- pass
- class Handler(object):
- def index(self):
- obj = DbHelper.singleton()
- print id(single)
- obj.create()
- return 'index'
- def news(self):
- return 'news'
- def RunServer(environ, start_response):
- start_response('200 OK', [('Content-Type', 'text/html')])
- url = environ['PATH_INFO']
- temp = url.split('/')[1]
- obj = Handler()
- is_exist = hasattr(obj, temp)
- if is_exist:
- func = getattr(obj, temp)
- ret = func()
- return ret
- else:
- return '404 not found'
- if __name__ == '__main__':
- httpd = make_server('', 8001, RunServer)
- print "Serving HTTP on port 8001..."
- httpd.serve_forever()
Web应用实例-单例模式
总结:单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!!!
动态导入模块:
__import__('import_lib.metaclass‘)#这是解释器自己内部用的
- mod = __import__('lib.aa')
print(mod.aa)
obj=mod.aa.C()
print(obj.name)
- import importlib
- __import__('import_lib.metaclass') #这是解释器自己内部用的
- #importlib.import_module('import_lib.metaclass') #与上面这句效果一样,官方建议用这个
- mod = __import__('lib.aa')
- print(mod.aa)
- obj=mod.aa.C()
- print(obj.name)
- /usr/bin/python3.5 /home/ld/mytest/day3/test_dimport.py
- crh
python----------反射和设计模式的更多相关文章
- python 反射
python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! 反射的四个基本函数使用 hasattr,getattr,setatt ...
- 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作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...
- python 反射机制在实际的应用场景讲解
剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...
- 【Python】python 反射机制在实际的应用场景讲解
剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...
- python 反射机制 ( 广泛应用于URL参数)
web实例 考虑有这么一个场景,根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个url路由器的功能,这在web框架里是核心部件之一.下面有一个精简版的示例: 首先,有一个comm ...
- python反射问题
python中的__import__是以字符串的形式反射导入模块并以字符串的形式执行函数
随机推荐
- 在MAC下 Python+Django+mysql配置
今天在搭建Django+mysql环境的时候遇到了一点问题,记录下来. 安装环境:OS X 10.10操作系统,Python 2.7. MySQLdb其实包含在MySQL-python包中,因此无论下 ...
- IOS QuartzCore核心动画框架
IOS QuartzCore核心动画框架 核心动画框架 使用核心动画需要引入的框架:#import CALayer: CoreAnimation CALayer就是UIView上的图层,很多的CALa ...
- 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。
原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...
- Oracle问题解决(sqlplus无法登陆)
命令行 sqlplus 无法登陆,常常是用户名/密码错误.监听配置错误或未启动.数据库服务名丢失等等原因. 用户名/密码错误 找到自己设的密码 这全靠自己创建数据库实例时,备份或记住相关信息 若最后没 ...
- Java中swap解惑
直接上代码…… public class Swap { public static void main(String[] args) { int a[] = new int[]{1,2}; Syste ...
- Android 5.0 技术新趋势
由于 Android 的版本分裂比较严重,整个新系统升级可能需要一两年甚至更长时间.所以目前使用 Android 5.0 的大部分是喜欢尝鲜的用户,同时现在市场上能够很好支持 Android 5.0 ...
- C# static成员的构造顺序
熟知的几个原则 1.static字段初始化先于static构造函数 2.static字段按顺序初始化 3.static字段和static构造函数只执行一次 public class Foo { pub ...
- c# 循环语句练习题;
1. 求100以内质数的和 2. 兔子问题 3. 九九乘法表: 一行一行打印: 4. 有一张超大的纸: 纸质的厚度是0.01: 对折多少次,可以达到珠峰的高度: 按照8848来计算: ...
- angularjs学习总结(~~很详细的教程)
1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...
- Maven实战二
简述: 现需要 在Eclipse中配置Maven插件 安装maven应用,配置Maven环境变量 建立Maven管理的工程 用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首先到 ...