面向对象及其相关
2015-12-19 14:28
225 查看
面向对象及其相关:
面向对象基础篇可以参考:[初识面向对象编程] http://www.cnblogs.com/yangyinghua/p/5020914.html
[面向对象的三大特性介绍] http://www.cnblogs.com/yangyinghua/p/5024892.html
[面向对象之类成员] http://www.cnblogs.com/yangyinghua/p/5041640.html
相关知识点:
isinstance(obj,cls)检查obj是否是类cls的对象
>>> num1 = 10 >>> nmu2 = 20 >>> >>> isinstance(num1,int) True >>> str1 = 'abc' >>> isinstance(str1,str) True
class A: pass class B(A): pass b = B() print isinstance(b,A)
issubclass(sub, super)
检查sub类是否是 super 类的派生类
class A(object): pass class B(A): pass print issubclass(B, A)
一、异常处理:
try: #正常代码逻辑块 user_input = int(raw_input('请输入数字:').strip()) except Exception,e: #逻辑代码块出现错误 print "error:",e # 日志,错误详细,e,e中封装了上面出现的错误 try: user_input = int(raw_input('请输入数字:').strip()) except Exception,e: print "输入错误,请输入数字"
python中还有很多Error类型:
以下是几种比较常见的异常类型:
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
异常捕获
捕获:IndexError 实例:try: li = ['a','b','c'] print li[10] except IndexError,e: print "不存在这个下标,索引" print "异常报错信息:",e
执行结果:
不存在这个下标,索引 异常报错信息: list index out of range
万能异常:
li = ['a','b','c'] try: li[10] except IndexError,e: print "不存在这个下标,索引" print "异常报错信息:",e except Exception,e: #(当所有的异常捕获完之后,最后为了保证程序正常运行,这里可以在最后加一个万能异常,相当于最后一道防护线) print e
知识点:
IndexError 等这些异常,都是Exception的派生类
主动触发异常:
try: raise Exception('错误了。。。') except Exception,e: print e
知识点1,请注意:
try: pass # 比如这里是连接数据库进行相关操作 except IndexError,e: pass except Exception,e: pass else: pass #逻辑块出现异常 finally: #不管上面的执行正确与否,最终需要执行 #上面执行完后,需要断开数据库,就可以在这里操作 pass
知识点2:
try: user_input = int(raw_input('请输入数字:').strip()) except Exception,e: print "error:",e # e,调用的是Exception中__str__ 方法
例子:
class Derror(Exception): def __str__(self): return 'Derror error' try: raise Derror('错误') except Exception,e: print e
自定义异常
class Derror(Exception): def __init__(self,msg): self.Message = msg def __str__(self): if self.Message: return self.Message else: return 'Derror error' try: raise Derror('错误了,你快看看吧~') except Derror,e: print e
执行结果:
错误了,你快看看吧~
二、断言
assert +条件 #用途,程序调试assert 1 == 1 # 如果1等于1,正确,什么也不执行,否则,报异常
三、反射
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。直接看代码:
home.py
def login(): return "welcome to login mysite" def logout(): return "logout..." def shows(): return "shows" def watch(): return "watch" def buy(): return "buy"
方式一:
index.py
url = raw_input('请输入url:').strip() if url == 'home/login': result = home.login() print result elif url == 'home/logout': result = home.logout() print result elif url == 'home/shows': result = home.shows() print result elif url == 'home/watch': result = home.watch() print result elif url == 'home/buy': result = home.buy() print result else: print '404 not found'
执行结果:
请输入url:home/buy buy
方式二:
通过getattr执行:
url = raw_input('请输入url:').strip() controller,action = url.split('/') func = getattr(home,action) result = func() print result
执行结果:
请输入url:home/buy buy
先看下面的例子:(经典例子)
webindex.py
from wsgiref.simple_server import make_server def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) url = environ['PATH_INFO'] temp = url.split('/')[1] # localhost:8001/login 得到第一个元素:login import home is_exist = hasattr(home, temp) # 去home模块中检查,是否含有指定函数 if is_exist: #如果存在指定的函数 func = getattr(home, 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()
执行:
Serving HTTP on port 8001... 127.0.0.1 - - [13/Dec/2015 14:38:01] "GET /login/login HTTP/1.1" 200 23 127.0.0.1 - - [13/Dec/2015 14:38:01] "GET /favicon.ico HTTP/1.1" 200 13
然后后浏览器执行:
http://localhost:8001/login/login
输出结果:
welcome to login mysite
setattr: 设置成员
print dir(home) setattr(home,'allen','good job') #‘good job’这里也可以是函数,如下: print dir(home) setattr(home,'allen',lambda x:x+1) #设置成员 print dir(home) delattr(home,'login') #删除成员 print dir(home)
执行结果如下:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'buy', 'login', 'logout', 'shows', 'watch'] ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'allen', 'buy', 'login', 'logout', 'shows', 'watch'] ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'allen', 'buy', 'login', 'logout', 'shows', 'watch'] ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'allen', 'buy', 'logout', 'shows', 'watch']
hasattr: 检查是否含有成员
class Person(object): country = 'china' def __init__(self): self.name = 'allen' def hand(self): print "This is my hand" @staticmethod def head(self): print "This is my head" @classmethod def foot(self): print "This is my foot" print "===== Person ============" print Person.__dict__ print Person.__dict__.values() print hasattr(Person,'country') print "==== P1 =================" P1 = Person() print P1.__dict__ print P1.__dict__.values() print hasattr(P1,'name') print hasattr(P1,'hand')
执行结果如下:
===== Person ============ {'__dict__': <attribute '__dict__' of 'Person' objects>, '__module__': '__main__', '__doc__': None, 'foot': <classmethod object at 0x109c3e520>, 'country': 'china', '__weakref__': <attribute '__weakref__' of 'Person' objects>, 'head': <staticmethod object at 0x109c3e4e8>, '__init__': <function __init__ at 0x109c40c80>, 'hand': <function hand at 0x109c40cf8>} [<attribute '__dict__' of 'Person' objects>, '__main__', None, <classmethod object at 0x109c3e520>, 'china', <attribute '__weakref__' of 'Person' objects>, <staticmethod object at 0x109c3e4e8>, <function __init__ at 0x109c40c80>, <function hand at 0x109c40cf8>] True ==== P1 ================= {'name': 'allen'} ['allen'] True True
home/login 前面讲的都是login
下面讲讲home (提示:路由系统就是基于这个做的,我指的是其中一部分实现)import home #下面的方面更吊,简直碉堡了,而且不需要使用import的方法,直接动态导入 module = __import__('home')
controller,action = raw_input("请输入:").split('/') module = __import__(controller) func = getattr(module,action) result = func() print result
执行结果:
请输入:home/login welcome to login mysite
关于设计模式,将在之后详细介绍
更多连接:http://www.cnblogs.com/wupeiqi/articles/5017742.html
相关文章推荐
- SERVICE_USE_PID
- libjpeg 库的安装
- JavaIDE__MyEclipse中SVN的使用方法
- Java 程序员应会的 Linux 命令
- 233. Number of Digit One
- Unity3D手游开发日记(1) - 移动平台实时阴影方案
- 求素数的几种方法
- 第2章 使用Intent在活动之间穿梭
- 构建高效的研发与自动化运维
- POJ 3176:Cow Bowling
- html5 canvas 笔记一(基本用法与绘制图形)
- cut 截取
- 线程同步(同步对象、同步访问对象)http://blog.csdn.net/akof1314/article/details/5764200
- 斐波那契堆
- 使用Volley实现session会话保持
- mybatis报错:批量设置别名时
- 新版数据库分页方法(Sql server2012)
- xamarin for android 生成时“java.exe已退出 代码为1”
- Bash中的$符号
- JavaScript 三种不同位置代码的写法