面向对象基础

基础内容介绍详见一下两篇博文:

其他相关

一、isinstance(obj, cls)

检查obj是否是类 cls 的对象

  1. class Foo(object):
  2. pass
  3.  
  4. obj = Foo()
  5.  
  6. isinstance(obj, Foo)

二、issubclass(sub, super)

检查sub类是否是 super 类的派生类

  1. class Foo(object):
  2. pass
  3.  
  4. class Bar(Foo):
  5. pass
  6.  
  7. issubclass(Bar, Foo)

三、异常处理

1、异常基础

在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!!

  1. try:
  2. pass
  3. except Exception as ex:
  4. pass

需求:将用户输入的两个数字相加

  1. while True:
  2. num1 = raw_input('num1:')
  3. num2 = raw_input('num2:')
  4. try:
  5. num1 = int(num1)
  6. num2 = int(num2)
  7. result = num1 + num2
  8. except Exception, e:
  9. print '出现异常,信息如下:'
  10. print e

2、异常种类

python中的异常种类非常多,每个异常专门用于处理某一项异常!!!

  1. AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
  2. IOError 输入/输出异常;基本上是无法打开文件
  3. ImportError 无法引入模块或包;基本上是路径问题或名称错误
  4. IndentationError 语法错误(的子类) ;代码没有正确对齐
  5. IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
  6. KeyError 试图访问字典里不存在的键
  7. KeyboardInterrupt Ctrl+C被按下
  8. NameError 使用一个还未被赋予对象的变量
  9. SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
  10. TypeError 传入对象类型与要求的不符合
  11. UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
  12. 导致你以为正在访问它
  13. ValueError 传入一个调用者不期望的值,即使值的类型是正确的

常用异常

  1. ArithmeticError
  2. AssertionError
  3. AttributeError
  4. BaseException
  5. BufferError
  6. BytesWarning
  7. DeprecationWarning
  8. EnvironmentError
  9. EOFError
  10. Exception
  11. FloatingPointError
  12. FutureWarning
  13. GeneratorExit
  14. ImportError
  15. ImportWarning
  16. IndentationError
  17. IndexError
  18. IOError
  19. KeyboardInterrupt
  20. KeyError
  21. LookupError
  22. MemoryError
  23. NameError
  24. NotImplementedError
  25. OSError
  26. OverflowError
  27. PendingDeprecationWarning
  28. ReferenceError
  29. RuntimeError
  30. RuntimeWarning
  31. StandardError
  32. StopIteration
  33. SyntaxError
  34. SyntaxWarning
  35. SystemError
  36. SystemExit
  37. TabError
  38. TypeError
  39. UnboundLocalError
  40. UnicodeDecodeError
  41. UnicodeEncodeError
  42. UnicodeError
  43. UnicodeTranslateError
  44. UnicodeWarning
  45. UserWarning
  46. ValueError
  47. Warning
  48. ZeroDivisionError

更多异常

  1. dic = ["alex", 'alex']
  2. try:
  3. dic[10]
  4. except IndexError, e:
  5. print e

实例IndexError

  1. dic = {'k1':'v1'}
  2. try:
  3. dic['k20']
  4. except KeyError, e:
  5. print e

实例KeyError

  1. s1 = 'hello'
  2. try:
  3. int(s1)
  4. except ValueError, e:
  5. print e

实例ValueError

对于上述实例,异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

  1. # 未捕获到异常,程序直接报错
  2.  
  3. s1 = 'hello'
  4. try:
  5. int(s1)
  6. except IndexError as e:
  7. print e

所以,写程序时需要考虑到try代码块中可能出现的任意异常,可以这样写:

  1. s1 = 'hello'
  2. try:
  3. int(s1)
  4. except IndexError as e:
  5. print e
  6. except KeyError as e:
  7. print e
  8. except ValueError as e:
  9. print e

万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常,即:

  1. s1 = 'hello'
  2. try:
  3. int(s1)
  4. except Exception as e:
  5. print e

接下来你可能要问了,既然有这个万能异常,其他异常是不是就可以忽略了!

答:当然不是,对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行。

  1. s1 = 'hello'
  2. try:
  3. int(s1)
  4. except KeyError as e:
  5. print '键错误'
  6. except IndexError as e:
  7. print '索引错误'
  8. except Exception as e:
  9. print '错误'

3、异常其他结构

  1. try:
  2. # 主代码块
  3. pass
  4. except KeyError,e:
  5. # 异常时,执行该块
  6. pass
  7. else:
  8. # 主代码块执行完,执行该块
  9. pass
  10. finally:
  11. # 无论异常与否,最终执行该块
  12. pass

4、主动触发异常

  1. try:
  2. raise Exception('错误了。。。')
  3. except Exception as e:
  4. print(e)

5、自定义异常

  1. class AlexException(Exception):
  2.  
  3. def __init__(self, msg):
  4. self.message = msg
  5.  
  6. def __str__(self):
  7. return self.message
  8.  
  9. try:
  10. raise AlexException('我的异常')
  11. except AlexException as e:
  12. print(e)

6、断言

  1. # assert 条件
  2.  
  3. assert 1 == 1
  4. assert 1 == 2
  5. 如果成立就成立,不成立就报错
  6.  
  7. # 添加异常参数
  8. assert 2==1,'2不等于1'

设计模式

一、单例模式

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

学习单例之前,首先来回顾下面向对象的内容:

python的面向对象由两个非常重要的两个“东西”组成:类、实例

面向对象场景一:

如:创建三个游戏人物,分别是:

  • 苍井井,女,18,初始战斗力1000

  • 东尼木木,男,20,初始战斗力1800

  • 波多多,女,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应用实例-单例模式

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

【Python之路】第七篇--Python基础之面向对象及相关的更多相关文章

  1. Python之路第七天,基础(9)-面向对象(上)

    面向对象的编程思想 回想 我们所学过的编程方法: 面向过程:根据业务逻辑从上到下写堆叠代码. 函数式编程:将重复的代码封装到函数中,只需要写一遍,之后仅调用函数即可. 面向过程编程最易被初学者接受,其 ...

  2. Python之路(第七篇)Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") ret ...

  3. 【Python之路】第九篇--Python基础之线程、进程和协程

    进程与线程之间的关系 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除.线程可与属于同一进程的其它线程共享进程所拥有的全 ...

  4. python之路第四篇(基础篇)

    一.冒泡算法实现: 方法一: li = [13,33,12,80,66,1] print li for m in range(4): num1 = li[m] num2 = li[m+1] if nu ...

  5. 【Python之路】第一篇--Linux基础命令

    pwd 命令 查看”当前工作目录“的完整路径 pwd -P # 显示出实际路径,而非使用连接(link)路径:pwd显示的是连接路径 .   表示当前目录 ..  表示上级目录 /  表示根目录 ls ...

  6. Python之路(第八篇)Python内置函数、zip()、max()、min()

    一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算,如果全部都是true,就返回true, 但是如果是空字符串.空列表也返回t ...

  7. Python之路(第五篇) Python基本数据类型集合、格式化、函数

    一.变量总结 1.1 变量定义 记录某种状态或者数值,并用某个名称代表这个数值或状态. 1.2 变量在内存中的表现形式 Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是 ...

  8. 【Python之路】特别篇--Python正则表达式

    正则表达式的基础 正则表达式并不是Python的一部分. 正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大. 得益于这一点 ...

  9. 【Python之路】特别篇--Python面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  10. 【Python之路】特别篇--Python切片

    字符串切片操作 切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割. 注意: 数是可选的,而冒号是必须的. consequence[start:end:step] 切片操作符中的 ...

随机推荐

  1. QuickSwitchSVNClient,快速完成SVN Switch的工具

    [开源]QuickSwitchSVNClient,快速完成SVN Switch的工具 在实际的开发中,我们一般使用SVN工具进行源代码的管理.在实际的产品开发中,根据项目的一些定制要求,往往需要对某一 ...

  2. 使用diff和patch指令生成文件差异和还原文件

    使用diff和patch指令生成文件差异和还原文件 创建一个新的文件夹test然后进入test mkdir test cd test 首先创建文件a vim a.txt 随便输入一段文字后保存不退出. ...

  3. html5基础的常用的技巧

    html5基础的常用的技巧 1. 新的Doctype声明 XHTML的声明太长了,我相信很少会有前端开发人员能手写出这个Doctype声明. <!DOCTYPE html PUBLIC &quo ...

  4. Winform 单实例运行

    Winform 单实例运行 前言 前两天在博客园看到<如何防止程序多次运行>,文章写的很好,最后还留下一个问题给我们思考.关于Winform的防止多次运行,曾经也想研究过,但是后来工作上没 ...

  5. 微软必应借PK谷歌突围中国搜索市场

    Bing“必应”是微软2009年推出的搜索品牌(http://www.bing.com),它取代的是同门师兄Live Search.进入2013年,在国内及好莱坞的多部大片里面,我都看到了Bing搜索 ...

  6. 链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链

    最近研究链方法,稍微总结一下,以后继续补充: 弁言: 上一专题分析了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的分析都是委托只是封装一个方法,那委 ...

  7. PHP常用之封装分页工具类

    分页基本上是每个项目都会使用到的,所以呢,把它封装成一个工具类,以后直接调用就可以了(虽然TP框架的灰常强大,但是自己封一个也未尝不可.),这样既省时又省力还赚'工分'. 我封的这个分页工具类还比较完 ...

  8. python之路 - 基础4

    1.函数非固定参数 *args *kwargs def test(*args): print (args) test(1,2,3,4,5) test(*[1,2,3,4,5]) #*args = *[ ...

  9. 关于angularjs的$state.go()与ui-sref传参问题

    上次转发过关于angularjs回退的文章,回退用到的还是js的回退功能,直接用history.back();实现功能,当时顺便提了下$state.go()有关路由跳转. 那这回就全面解析下$stat ...

  10. KB2533623 下载

    服务器上要部署.NET Core 的环境, 先要在服务器上安装Core SDK.直达连接 下载安装一切顺利: 下面开始检验是否正确安装了↓ 运行→cmd→dotnet 结果报错↓ Failed to ...