一、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)
三、异常处理
基本格式:
try:
pass
except Exception,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
捕获到异常后,返回一个信息,此处e一般可以输出在日志中,以便查看出错的内容。
常见异常:
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
代码块中可能出现的任意异常:
s1 = 'hello'
try:
int(s1)
except IndexError,e:
print e
except KeyError,e:
print e
except ValueError,e:
print e
万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常,即:
s1 = 'hello'
try:
int(s1)
except Exception,e:
print e
对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行。
s1 = 'hello'
try:
int(s1)
except KeyError,e:
print '键错误'
except IndexError,e:
print '索引错误'
except Exception, e:
print '错误'
异常其他结构
try:
# 主代码块
pass
except KeyError,e:
# 异常时,执行该块
pass
else:
# 主代码块执行完,执行该块
pass
finally:
# 无论异常与否,最终执行该块
pass
主动触发异常
try:
raise Exception('错误了。。。') ##主动触发异常
except Exception,e:
print e
自定义异常
class WupeiqiException(Exception):
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message
try:
raise WupeiqiException('我的异常')
except WupeiqiException,e:
print e
断言:
# assert 条件
assert 1 == 1
如果上面的条件成立,才会执行下面的代码。
assert 1 == 2
上面的条件不成立,则会退也程序。
它相当于raise类似。
##在print 一个对象的时候,一般打印出来的都是该对象下的__str__方法。
四、反射
常用框架类型:
MVC框架:
models
views
controllers
MTV框架:
models
templates
views
手动获取url原理:
url='aaa/bbb'
d,e= url.split('/')
print d
print e
反射函数:getattr
首先新建一个py模块,创建两个函数,内容如下:
def a():
return 'hello tingyun'
def b():
return "hello mynetuser"
再新建一个文件,导入上面的模块:
import myflas
fun1=getattr(myflas,'a')
print fun1()
fun2=getattr(myflas,'b')
print fun2()
通过getattr内置函数来获取myflas模块中的两个函数a 和 b,如果找到了,就将该函数返回给新的值,此处fun1函数就是a函数名。
setattr 作用:在模块中添加一个成员
setattr(myflas,'bright',lambda x,y:x+y)
fun3=getattr(myflas,'bright')
print fun3(43,98)
在myflas中新增加一个函数bright。
>>> hasattr(system,'argv') ##hasattr用来判断system模块中有没有argv函数
True
>>> delattr(system,'argv') ##delattr删除system模块中的argv函数
以上四个函数:hasattr,getattr,setattr,delattr除了可以对模块进行操作以外,还可以对类和对象中的成员进行操作。
多层反射:
反射的函数可以对模块或类进行操作,但是当一个类在一个模块中时,此时只用一次反射也只能将模块中的函数进行处理,却不能对模块中的类进行处理,此时就需要多层的反射来处理。
首先用一个getattr获取模块中的类,将此类赋值一个变量,再对该对象进行getattr来获取类中的静态方法。
总结,getattr就是去一个容器(包括模块和类等)中找它的元素。
五、动态模块导入
如果导入的模块还未确定的变量名,此时就可以用以下方法来导入:
__import__('obj')
下面的表示将导入的动态模块命名为opt,此功能模import x as y.
opt=__import__('obj')
举例:
modu=raw_input('pls input a name:')
opt=__import__(modu)
此处的modu是一个变量,因此用上面的方法来导入后,即可进行正常的模块操作了。
六、设计模式
单例模式