【Python之路】第七篇--Python基础之面向对象及相关
面向对象基础
基础内容介绍详见一下两篇博文:
其他相关
一、isinstance(obj, cls)
检查obj是否是类 cls 的对象
- class Foo(object):
- pass
- obj = Foo()
- isinstance(obj, Foo)
二、issubclass(sub, super)
检查sub类是否是 super 类的派生类
- class Foo(object):
- pass
- class Bar(Foo):
- pass
- issubclass(Bar, Foo)
三、异常处理
1、异常基础
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!!
- try:
- pass
- except Exception as ex:
- pass
需求:将用户输入的两个数字相加
- while True:
- num1 = raw_input('num1:')
- num2 = raw_input('num2:')
- try:
- num1 = int(num1)
- num2 = int(num2)
- result = num1 + num2
- except Exception, e:
- print '出现异常,信息如下:'
- print e
2、异常种类
python中的异常种类非常多,每个异常专门用于处理某一项异常!!!
- AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
- IOError 输入/输出异常;基本上是无法打开文件
- ImportError 无法引入模块或包;基本上是路径问题或名称错误
- IndentationError 语法错误(的子类) ;代码没有正确对齐
- IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
- KeyError 试图访问字典里不存在的键
- KeyboardInterrupt Ctrl+C被按下
- NameError 使用一个还未被赋予对象的变量
- SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
- TypeError 传入对象类型与要求的不符合
- UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
- 导致你以为正在访问它
- ValueError 传入一个调用者不期望的值,即使值的类型是正确的
常用异常
- ArithmeticError
- AssertionError
- AttributeError
- BaseException
- BufferError
- BytesWarning
- DeprecationWarning
- EnvironmentError
- EOFError
- Exception
- FloatingPointError
- FutureWarning
- GeneratorExit
- ImportError
- ImportWarning
- IndentationError
- IndexError
- IOError
- KeyboardInterrupt
- KeyError
- LookupError
- MemoryError
- NameError
- NotImplementedError
- OSError
- OverflowError
- PendingDeprecationWarning
- ReferenceError
- RuntimeError
- RuntimeWarning
- StandardError
- StopIteration
- SyntaxError
- SyntaxWarning
- SystemError
- SystemExit
- TabError
- TypeError
- UnboundLocalError
- UnicodeDecodeError
- UnicodeEncodeError
- UnicodeError
- UnicodeTranslateError
- UnicodeWarning
- UserWarning
- ValueError
- Warning
- ZeroDivisionError
更多异常
- dic = ["alex", 'alex']
- try:
- dic[10]
- except IndexError, e:
- print e
实例IndexError
- dic = {'k1':'v1'}
- try:
- dic['k20']
- except KeyError, e:
- print e
实例KeyError
- s1 = 'hello'
- try:
- int(s1)
- except ValueError, e:
- print e
实例ValueError
对于上述实例,异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
- # 未捕获到异常,程序直接报错
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print e
所以,写程序时需要考虑到try代码块中可能出现的任意异常,可以这样写:
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print e
- except KeyError as e:
- print e
- except ValueError as e:
- print e
万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常,即:
- s1 = 'hello'
- try:
- int(s1)
- except Exception as e:
- print e
接下来你可能要问了,既然有这个万能异常,其他异常是不是就可以忽略了!
答:当然不是,对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行。
- s1 = 'hello'
- try:
- int(s1)
- except KeyError as e:
- print '键错误'
- except IndexError as e:
- print '索引错误'
- except Exception as e:
- print '错误'
3、异常其他结构
- try:
- # 主代码块
- pass
- except KeyError,e:
- # 异常时,执行该块
- pass
- else:
- # 主代码块执行完,执行该块
- pass
- finally:
- # 无论异常与否,最终执行该块
- pass
4、主动触发异常
- try:
- raise Exception('错误了。。。')
- except Exception as e:
- print(e)
5、自定义异常
- class AlexException(Exception):
- def __init__(self, msg):
- self.message = msg
- def __str__(self):
- return self.message
- try:
- raise AlexException('我的异常')
- except AlexException as e:
- print(e)
6、断言
- # assert 条件
- assert 1 == 1
- assert 1 == 2
- 如果成立就成立,不成立就报错
- # 添加异常参数
- assert 2==1,'2不等于1'
设计模式
一、单例模式
单例,顾名思义单个实例。
学习单例之前,首先来回顾下面向对象的内容:
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应用实例-单例模式
总结:单例模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!!!
【Python之路】第七篇--Python基础之面向对象及相关的更多相关文章
- Python之路第七天,基础(9)-面向对象(上)
面向对象的编程思想 回想 我们所学过的编程方法: 面向过程:根据业务逻辑从上到下写堆叠代码. 函数式编程:将重复的代码封装到函数中,只需要写一遍,之后仅调用函数即可. 面向过程编程最易被初学者接受,其 ...
- Python之路(第七篇)Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数
一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") ret ...
- 【Python之路】第九篇--Python基础之线程、进程和协程
进程与线程之间的关系 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除.线程可与属于同一进程的其它线程共享进程所拥有的全 ...
- python之路第四篇(基础篇)
一.冒泡算法实现: 方法一: li = [13,33,12,80,66,1] print li for m in range(4): num1 = li[m] num2 = li[m+1] if nu ...
- 【Python之路】第一篇--Linux基础命令
pwd 命令 查看”当前工作目录“的完整路径 pwd -P # 显示出实际路径,而非使用连接(link)路径:pwd显示的是连接路径 . 表示当前目录 .. 表示上级目录 / 表示根目录 ls ...
- Python之路(第八篇)Python内置函数、zip()、max()、min()
一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算,如果全部都是true,就返回true, 但是如果是空字符串.空列表也返回t ...
- Python之路(第五篇) Python基本数据类型集合、格式化、函数
一.变量总结 1.1 变量定义 记录某种状态或者数值,并用某个名称代表这个数值或状态. 1.2 变量在内存中的表现形式 Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是 ...
- 【Python之路】特别篇--Python正则表达式
正则表达式的基础 正则表达式并不是Python的一部分. 正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大. 得益于这一点 ...
- 【Python之路】特别篇--Python面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- 【Python之路】特别篇--Python切片
字符串切片操作 切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割. 注意: 数是可选的,而冒号是必须的. consequence[start:end:step] 切片操作符中的 ...
随机推荐
- QuickSwitchSVNClient,快速完成SVN Switch的工具
[开源]QuickSwitchSVNClient,快速完成SVN Switch的工具 在实际的开发中,我们一般使用SVN工具进行源代码的管理.在实际的产品开发中,根据项目的一些定制要求,往往需要对某一 ...
- 使用diff和patch指令生成文件差异和还原文件
使用diff和patch指令生成文件差异和还原文件 创建一个新的文件夹test然后进入test mkdir test cd test 首先创建文件a vim a.txt 随便输入一段文字后保存不退出. ...
- html5基础的常用的技巧
html5基础的常用的技巧 1. 新的Doctype声明 XHTML的声明太长了,我相信很少会有前端开发人员能手写出这个Doctype声明. <!DOCTYPE html PUBLIC &quo ...
- Winform 单实例运行
Winform 单实例运行 前言 前两天在博客园看到<如何防止程序多次运行>,文章写的很好,最后还留下一个问题给我们思考.关于Winform的防止多次运行,曾经也想研究过,但是后来工作上没 ...
- 微软必应借PK谷歌突围中国搜索市场
Bing“必应”是微软2009年推出的搜索品牌(http://www.bing.com),它取代的是同门师兄Live Search.进入2013年,在国内及好莱坞的多部大片里面,我都看到了Bing搜索 ...
- 链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链
最近研究链方法,稍微总结一下,以后继续补充: 弁言: 上一专题分析了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的分析都是委托只是封装一个方法,那委 ...
- PHP常用之封装分页工具类
分页基本上是每个项目都会使用到的,所以呢,把它封装成一个工具类,以后直接调用就可以了(虽然TP框架的灰常强大,但是自己封一个也未尝不可.),这样既省时又省力还赚'工分'. 我封的这个分页工具类还比较完 ...
- python之路 - 基础4
1.函数非固定参数 *args *kwargs def test(*args): print (args) test(1,2,3,4,5) test(*[1,2,3,4,5]) #*args = *[ ...
- 关于angularjs的$state.go()与ui-sref传参问题
上次转发过关于angularjs回退的文章,回退用到的还是js的回退功能,直接用history.back();实现功能,当时顺便提了下$state.go()有关路由跳转. 那这回就全面解析下$stat ...
- KB2533623 下载
服务器上要部署.NET Core 的环境, 先要在服务器上安装Core SDK.直达连接 下载安装一切顺利: 下面开始检验是否正确安装了↓ 运行→cmd→dotnet 结果报错↓ Failed to ...