反射:

把字符串映动态射成对象内存地址。

hasattr():判断一个对象里是否有对应的字符串的方法

getattr():根据字符串去获取obj对象里的对应方法的内存地址。

  1. class Dog(object):
  2. def __init__(self,name):
  3. self.name = name
  4. def eat(self):
  5. print('%s is eating...',self.name)
  6.  
  7. d = Dog('NiuHanYang')
  8. choice = input('>>:').strip() # choice是字符串,不能直接调用,使用反射
  9.  
  10. print(hasattr(d,choice))
    print(getattr(d,choice)) # 得到的内存地址
    getattr(d,choice)() # 调用eat方法
  11.  
  12. if hasattr(d,choice):
      func = getattr(d,choice)
      func('chenRonghua')

setattr(): is equivalent to 'x.y =v'

  1. def bulk(self):
  2. print('%s is yelling...' %self.name)
  3.  
  4. class Dog(object):
  5. def __init__(self,name):
  6. self.name = name
  7.  
  8. def eat(self,food):
  9. print('%s is eating...'%self.name,food)
  10.  
  11. d=Dog('NiuHanYang')
  12. choice = input('>>:').strip()
  13. if hasattr(d,choice):
  14. func = getattr(d,choice)
  15. func('chenRonghua')
  16. else:
  17. setattr(d,choice,bulk)
  18.  
  19. d.talk(d)
  20.  
  21. >>:talk
  22. NiuHanYang is yelling...

动态装方法:

  1. def bulk(self):
  2. print('%s is yelling...' %self.name)
  3.  
  4. class Dog(object):
  5. def __init__(self,name):
  6. self.name = name
  7.  
  8. def eat(self,food):
  9. print('%s is eating...'%self.name,food)
  10.  
  11. d=Dog('NiuHanYang')
  12. choice = input('>>:').strip()
  13. if hasattr(d,choice):
  14. func = getattr(d,choice)
  15. func('chenRonghua')
  16. else:
  17. # setattr(d,choice,bulk)
  18. # d.talk(d)
  19. setattr(d,choice,22)
  20. print(getattr(d,choice))
  21.  
  22. >>:ff
  23. 22

delattr(对象,名字):直接名字对象。

  1. class Foo(object):
  2. def __init__(self):
  3. self.name = 'wupeiqi'
  4. def func(self):
  5. return 'func'
  6. obj = Foo()
  7.  
  8. print(hasattr(obj,'name'))
  9. print(hasattr(obj,'func'))
  10.  
  11. print(getattr(obj,'name'))
  12. print(getattr(obj,'func'))
  13.  
  14. print(setattr(obj,'age',18))
  15. print(setattr(obj,'show',lambda num:num+1))
  16.  
  17. # #### 删除成员 ####
  18. delattr(obj, 'name')
  19. delattr(obj, 'func')

详细解析:

当我们要访问一个对象的成员时,应该是这样操作:

  1. class Foo(object):
  2.  
  3. def __init__(self):
  4. self.name = 'alex'
  5.  
  6. def func(self):
  7. return 'func'
  8.  
  9. obj = Foo()
  10.  
  11. # 访问字段
  12. obj.name
  13. # 执行方法
  14. obj.func()
那么问题来了?
a、上述访问对象成员的 name 和 func 是什么? 
答:是变量名
b、obj.xxx 是什么意思? 
答:obj.xxx 表示去obj中或类中寻找变量名 xxx,并获取对应内存地址中的内容。
c、需求:请使用其他方式获取obj对象中的name变量指向内存中的值 “alex”
  1. lass Foo(object):
  2.  
  3. def __init__(self):
  4. self.name = 'alex'
  5.  
  6. # 不允许使用 obj.name
  7. obj = Foo()

答:有两种方式,如下:

  1. class Foo(object):
  2.  
  3. def __init__(self):
  4. self.name = 'alex'
  5.  
  6. def func(self):
  7. return 'func'
  8.  
  9. # 不允许使用 obj.name
  10. obj = Foo()
  11.  
  12. print obj.__dict__['name']

方式一

  1. class Foo(object):
  2.  
  3. def __init__(self):
  4. self.name = 'alex'
  5.  
  6. def func(self):
  7. return 'func'
  8.  
  9. # 不允许使用 obj.name
  10. obj = Foo()
  11.  
  12. print getattr(obj, 'name')

方式二

d、比较三种访问方式

  • obj.name
  • obj.__dict__['name']
  • getattr(obj, 'name')

答:第一种和其他种比,...
      第二种和第三种比,...

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. from wsgiref.simple_server import make_server
  4.  
  5. class Handler(object):
  6.  
  7. def index(self):
  8. return 'index'
  9.  
  10. def news(self):
  11. return 'news'
  12.  
  13. def RunServer(environ, start_response):
  14. start_response('200 OK', [('Content-Type', 'text/html')])
  15. url = environ['PATH_INFO']
  16. temp = url.split('/')[1]
  17. obj = Handler()
  18. is_exist = hasattr(obj, temp)
  19. if is_exist:
  20. func = getattr(obj, temp)
  21. ret = func()
  22. return ret
  23. else:
  24. return '404 not found'
  25.  
  26. if __name__ == '__main__':
  27. httpd = make_server('', 8001, RunServer)
  28. print "Serving HTTP on port 8000..."
  29. httpd.serve_forever()

结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!

设计模式:

一、单例模式

单例,顾名思义单个实例。

  1. 学习单例之前,首先来回顾下面向对象的内容:
  2.  
  3. python的面向对象由两个非常重要的两个“东西”组成:类、实例
  4.  
  5. 面向对象场景一:
  6.  
  7. 如:创建三个游戏人物,分别是:
  8.  
  9. 苍井井,女,18,初始战斗力1000
  10. 东尼木木,男,20,初始战斗力1800
  11. 波多多,女,19,初始战斗力2500
  1. # ##################### 定义类 #####################
  2. class Person:
  3.  
  4. def __init__(self, na, gen, age, fig):
  5. self.name = na
  6. self.gender = gen
  7. self.age = age
  8. self.fight =fig
  9.  
  10. def grassland(self):
  11. """注释:草丛战斗,消耗200战斗力"""
  12.  
  13. self.fight = self.fight - 200
  14.  
  15. # ##################### 创建实例 #####################
  16.  
  17. cang = Person('苍井井', '女', 18, 1000) # 创建苍井井角色
  18. dong = Person('东尼木木', '男', 20, 1800) # 创建东尼木木角色
  19. bo = Person('波多多', '女', 19, 2500) # 创建波多多角色

面向对象场景二:

如:创建对数据库操作的公共类

  1. # #### 定义类 ####
  2.  
  3. class DbHelper(object):
  4.  
  5. def __init__(self):
  6. self.hostname = '1.1.1.1'
  7. self.port = 3306
  8. self.password = 'pwd'
  9. self.username = 'root'
  10.  
  11. def fetch(self):
  12. # 连接数据库
  13. # 拼接sql语句
  14. # 操作
  15. pass
  16.  
  17. def create(self):
  18. # 连接数据库
  19. # 拼接sql语句
  20. # 操作
  21. pass
  22.  
  23. def remove(self):
  24. # 连接数据库
  25. # 拼接sql语句
  26. # 操作
  27. pass
  28.  
  29. def modify(self):
  30. # 连接数据库
  31. # 拼接sql语句
  32. # 操作
  33. pass
  34.  
  35. # #### 操作类 ####
  36.  
  37. db = DbHelper()
  38. db.create()

实例:结合场景二实现Web应用程序

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. from wsgiref.simple_server import make_server
  4.  
  5. class DbHelper(object):
  6.  
  7. def __init__(self):
  8. self.hostname = '1.1.1.1'
  9. self.port = 3306
  10. self.password = 'pwd'
  11. self.username = 'root'
  12.  
  13. def fetch(self):
  14. # 连接数据库
  15. # 拼接sql语句
  16. # 操作
  17. return 'fetch'
  18.  
  19. def create(self):
  20. # 连接数据库
  21. # 拼接sql语句
  22. # 操作
  23. return 'create'
  24.  
  25. def remove(self):
  26. # 连接数据库
  27. # 拼接sql语句
  28. # 操作
  29. return 'remove'
  30.  
  31. def modify(self):
  32. # 连接数据库
  33. # 拼接sql语句
  34. # 操作
  35. return 'modify'
  36.  
  37. class Handler(object):
  38.  
  39. def index(self):
  40. # 创建对象
  41. db = DbHelper()
  42. db.fetch()
  43. return 'index'
  44.  
  45. def news(self):
  46. return 'news'
  47.  
  48. def RunServer(environ, start_response):
  49. start_response('200 OK', [('Content-Type', 'text/html')])
  50. url = environ['PATH_INFO']
  51. temp = url.split('/')[1]
  52. obj = Handler()
  53. is_exist = hasattr(obj, temp)
  54. if is_exist:
  55. func = getattr(obj, temp)
  56. ret = func()
  57. return ret
  58. else:
  59. return '404 not found'
  60.  
  61. if __name__ == '__main__':
  62. httpd = make_server('', 8001, RunServer)
  63. print "Serving HTTP on port 8001..."
  64. httpd.serve_forever()

对于上述实例,每个请求到来,都需要在内存里创建一个实例,再通过该实例执行指定的方法。

那么问题来了...如果并发量大的话,内存里就会存在非常多功能上一模一样的对象。存在这些对象肯定会消耗内存,对于这些功能相同的对象可以在内存中仅创建一个,需要时都去调用,也是极好的!!!

铛铛 铛铛 铛铛铛铛铛,单例模式出马,单例模式用来保证内存中仅存在一个实例!!!

通过面向对象的特性,构造出单例模式:

  1. # ########### 单例类定义 ###########
  2. class Foo(object):
  3.  
  4. __instance = None
  5.  
  6. @staticmethod
  7. def singleton():
  8. if Foo.__instance:
  9. return Foo.__instance
  10. else:
  11. Foo.__instance = Foo()
  12. return Foo.__instance
  13.  
  14. # ########### 获取实例 ###########
  15. obj = Foo.singleton()

对于Python单例模式,创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.singleton() 。

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. from wsgiref.simple_server import make_server
  4.  
  5. # ########### 单例类定义 ###########
  6. class DbHelper(object):
  7.  
  8. __instance = None
  9.  
  10. def __init__(self):
  11. self.hostname = '1.1.1.1'
  12. self.port = 3306
  13. self.password = 'pwd'
  14. self.username = 'root'
  15.  
  16. @staticmethod
  17. def singleton():
  18. if DbHelper.__instance:
  19. return DbHelper.__instance
  20. else:
  21. DbHelper.__instance = DbHelper()
  22. return DbHelper.__instance
  23.  
  24. def fetch(self):
  25. # 连接数据库
  26. # 拼接sql语句
  27. # 操作
  28. pass
  29.  
  30. def create(self):
  31. # 连接数据库
  32. # 拼接sql语句
  33. # 操作
  34. pass
  35.  
  36. def remove(self):
  37. # 连接数据库
  38. # 拼接sql语句
  39. # 操作
  40. pass
  41.  
  42. def modify(self):
  43. # 连接数据库
  44. # 拼接sql语句
  45. # 操作
  46. pass
  47.  
  48. class Handler(object):
  49.  
  50. def index(self):
  51. obj = DbHelper.singleton()
  52. print id(single)
  53. obj.create()
  54. return 'index'
  55.  
  56. def news(self):
  57. return 'news'
  58.  
  59. def RunServer(environ, start_response):
  60. start_response('200 OK', [('Content-Type', 'text/html')])
  61. url = environ['PATH_INFO']
  62. temp = url.split('/')[1]
  63. obj = Handler()
  64. is_exist = hasattr(obj, temp)
  65. if is_exist:
  66. func = getattr(obj, temp)
  67. ret = func()
  68. return ret
  69. else:
  70. return '404 not found'
  71.  
  72. if __name__ == '__main__':
  73. httpd = make_server('', 8001, RunServer)
  74. print "Serving HTTP on port 8001..."
  75. httpd.serve_forever()

Web应用实例-单例模式

总结:单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!!!

动态导入模块:

__import__('import_lib.metaclass‘)#这是解释器自己内部用的

  1.  
  2. mod = __import__('lib.aa')
    print(mod.aa)
    obj=mod.aa.C()
    print(obj.name)
  1. import importlib
  2.  
  3. __import__('import_lib.metaclass') #这是解释器自己内部用的
  4. #importlib.import_module('import_lib.metaclass') #与上面这句效果一样,官方建议用这个
  1. mod = __import__('lib.aa')
  2. print(mod.aa)
  3. obj=mod.aa.C()
  4. print(obj.name)
  5.  
  6. /usr/bin/python3.5 /home/ld/mytest/day3/test_dimport.py
  7. crh

python----------反射和设计模式的更多相关文章

  1. python 反射

    python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! 反射的四个基本函数使用 hasattr,getattr,setatt ...

  2. python反射

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

  3. Python反射机制理解

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

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

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

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

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

  6. python反射机制深入分析

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

  7. python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

  8. 【Python】python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

  9. python 反射机制 ( 广泛应用于URL参数)

    web实例 考虑有这么一个场景,根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个url路由器的功能,这在web框架里是核心部件之一.下面有一个精简版的示例: 首先,有一个comm ...

  10. python反射问题

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

随机推荐

  1. 在MAC下 Python+Django+mysql配置

    今天在搭建Django+mysql环境的时候遇到了一点问题,记录下来. 安装环境:OS X 10.10操作系统,Python 2.7. MySQLdb其实包含在MySQL-python包中,因此无论下 ...

  2. IOS QuartzCore核心动画框架

    IOS QuartzCore核心动画框架 核心动画框架 使用核心动画需要引入的框架:#import CALayer: CoreAnimation CALayer就是UIView上的图层,很多的CALa ...

  3. 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。

    原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...

  4. Oracle问题解决(sqlplus无法登陆)

    命令行 sqlplus 无法登陆,常常是用户名/密码错误.监听配置错误或未启动.数据库服务名丢失等等原因. 用户名/密码错误 找到自己设的密码 这全靠自己创建数据库实例时,备份或记住相关信息 若最后没 ...

  5. Java中swap解惑

    直接上代码…… public class Swap { public static void main(String[] args) { int a[] = new int[]{1,2}; Syste ...

  6. Android 5.0 技术新趋势

    由于 Android 的版本分裂比较严重,整个新系统升级可能需要一两年甚至更长时间.所以目前使用 Android 5.0 的大部分是喜欢尝鲜的用户,同时现在市场上能够很好支持 Android 5.0 ...

  7. C# static成员的构造顺序

    熟知的几个原则 1.static字段初始化先于static构造函数 2.static字段按顺序初始化 3.static字段和static构造函数只执行一次 public class Foo { pub ...

  8. c# 循环语句练习题;

    1. 求100以内质数的和 2. 兔子问题 3. 九九乘法表:   一行一行打印: 4. 有一张超大的纸:   纸质的厚度是0.01:   对折多少次,可以达到珠峰的高度:   按照8848来计算: ...

  9. angularjs学习总结(~~很详细的教程)

    1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...

  10. Maven实战二

    简述: 现需要 在Eclipse中配置Maven插件 安装maven应用,配置Maven环境变量 建立Maven管理的工程 用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首先到 ...