python 11期 第八天

一、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是一个变量,因此用上面的方法来导入后,即可进行正常的模块操作了。


六、设计模式

单例模式


你可能感兴趣的:(面向对象,python)