python面向对象其他相关-异常处理-反射

1.isinstance(obj, cls)

检查是否obj是否是类 cls 的对象

 

2.issubclass(sub, super)

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

n1 = 10
a1 = "123"
print type(n1)
print type(a1)
print isinstance(n1,int)            #判断n1是否属于int类型,正确返回True
print ‘-->‘,isinstance(n1,str)      #判断n1是否属于str类型,正确返回True

class A:
    pass
class B(A):
    pass
a = B()
print isinstance(a,A)
print isinstance(a,B)
print issubclass(B,A)   #检查B类是不是A类的派生类
print issubclass(A,B)

执行结果:
<type ‘int‘>
<type ‘str‘>
True
--> False
True
True
True
False

 

3.异常处理

异常基础:

try:
    pass
except Exception,e:
    print e  #打印出异常内容
    pass

实例:

while True:
    num1 = raw_input(‘num1:‘)
    num2 = raw_input(‘num2:‘)
    try:
        num1 = int(num1)    #将输入内容转换为int类型
        num2 = int(num2)
        result = num1 + num2
    except Exception, e:
        print ‘出现异常,信息如下:‘    #当输入不为int类型,捕获异常
        print e

#运行
num1:1
num2:2
num1:d
num2:
3出现异常,信息如下:
invalid literal for int() with base 10: ‘d‘
num1:1.1
num2:2
出现异常,信息如下:
invalid literal for int() with base 10: ‘31.1‘

在实际应用中,我们可能需要捕获一些特定的异常,最后的时候才捕获所有异常类型

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

IndexError示例:

dic = ["ares", ‘aaaa‘]
try:
    dic[10]
except KeyError,e:
    print e

#执行结果报错为
  File "XXX", line 6, in <module>
    dic[10]
IndexError: list index out of range

#更改捕获的错误类型
dic = ["ares", ‘aaaa‘]
try:
    dic[10]
except IndexError, e:
    print e

#此时运行就捕获到了错误类型
list index out of range

KeyError示例:

dic = {‘k1‘:‘v1‘}
try:
    dic[‘k2‘]
except KeyError, e:
    print e

#捕获到的错误类型
‘k2‘

ValueError示例:

s1 = ‘hello‘
try:
    int(s1)
except ValueError, e:
    print e

#捕获到的错误
invalid literal for int() with base 10: ‘hello‘

如果是单纯的定义一个异常,则如果程序中出现其他异常就会报错,此时,我们可以捕获已知的异常类型,对于未知的异常类型可以用万能异常 Exception捕获。

s1 = ‘hello‘
try:
    int(s1)
except KeyError,e:
    print ‘键错误‘
except IndexError,e:
    print ‘索引错误‘
except Exception, e:
    print ‘错误‘

异常结构:

try:
    #逻辑代码
    pass
except IndexError,e:
    pass
except Exception,e:
    pass
else:
    #逻辑串中未出现异常
    pass
finally:
    #释放资源,断开连接
    #永远执行,逻辑代码执行完之后执行
    pass

有时我们可能想要主动触发异常,方法如下

try:
    raise Exception(‘错误了。。。‘)
except Exception,e:
    print e

#输出结果
错误了。。。

自定义异常:

#自定义异常
class OwnerError(Exception):
    def __init__(self,msg=None):
        self.message = msg
    def __str__(self):
        if self.message:
            return self.message
        else:
            return ‘Owner Error‘
try:
    raise OwnerError(‘erroreroor‘)
except Exception,e:
    print e

#输出内容
erroreroor

断言:

# assert 条件
assert 1 == 1
assert 1 == 2

#不太清楚,先记下

 

重头戏,反射来了。。。。。

python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

示例1:输入不同url来实现不同跳转

#home.py函数
def dev():
    return "home/dev"
def index():
    return "home/index"
def login():
    return "home/login"
def logout():
    return "home/logout"

#调用home模块
import home
#输入不同url跳转
#第一种实现方式,使用if/else做判断
print "-------------------->"
while True:
    url = raw_input("input url:")
    if url == "home/dev":
        ret = home.dev()
        print ret
    elif url == "home/index":
        ret = home.index()
        print ret
    elif url == "home/login":
        ret = home.login()
        print ret
    elif url == "home/logout":
        ret = home.logout()
        print ret
    else:
        print "404"

#运行结果
-------------------->
input url:home/dev
home/dev
input url:home/login
home/login
input url:home/sad
404

可以看到,上述代码已经基本实现了我们的需求,即输入不同url来进行不同的跳转,但是,如果url有上万个,这么方式显然是不可取的,那么,应该怎么办呢???

其实,将上述代码稍作修改即可:

#第二种实现方式,使用getattr函数做反射
import home
print "-------------------->"
while True:
    url = raw_input("input url:")
#对输入的url从/进行切割,例如输入home/dev,那么controller即为home,function为dev
    controller,function = url.split(‘/‘)
    #function为字符串
    #去某个函数(模块)中找函数,字符串函数名,若果有则获取函数
    func = getattr(home,function)
    ret = func()
    print ret

实例2:

#getattr,setattr,deleattr,hasattr,对内存某一个容器的元素做操作,只对内存做更改
#找到home文件,加载到内存
import home
print dir(home)
print hasattr(home,‘dev‘)   #判断home里是否存在dev方法
print hasattr(home,‘devv‘)
print getattr(home,‘dev‘)   #取出home里是否存在dev方法
setattr(home,‘ares‘,‘single‘)       #设置ares成员
print dir(home)
setattr(home,‘ares‘,lambda x:x+1)
print dir(home)
delattr(home,‘ares‘)        #删除ares成员
print dir(home)

#执行结果
[‘__author__‘, ‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘dev‘, ‘index‘, ‘login‘, ‘logout‘]
True
False
<function dev at 0x00000000027A1978>
[‘__author__‘, ‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘ares‘, ‘dev‘, ‘index‘, ‘login‘, ‘logout‘]
[‘__author__‘, ‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘ares‘, ‘dev‘, ‘index‘, ‘login‘, ‘logout‘]
[‘__author__‘, ‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘dev‘, ‘index‘, ‘login‘, ‘logout‘]

实例3:

class Foo:
    atatic_name = ‘ares‘
    def __init__(self):
        self.name = ‘ares‘
    def show(self):
        pass
    @staticmethod
    def static_show():
        pass
    @classmethod
    def class_show(self):
        pass

print Foo.__dict__.keys()
print hasattr(Foo,‘static_show‘)
obj = Foo()
print obj.__dict__
print obj.__dict__[‘name‘]      #将获取obj对象中的name变量指向内存中的值 “ares”
print hasattr(obj,‘name‘)
print hasattr(obj,‘show‘)
print getattr(obj,‘name‘)       #将获取obj对象中的name变量指向内存中的值 “ares”

#执行结果
[‘atatic_name‘, ‘__module__‘, ‘static_show‘, ‘show‘, ‘class_show‘, ‘__doc__‘, ‘__init__‘]
True
{‘name‘: ‘ares‘}
ares
True
True
ares

web框架实例,可在浏览器执行localhost:8001/xxx:

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]            #获取http://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()

一切事物皆对象,类是对象,模块也是对象!

 

单例模式:

demo:

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()

上述实例,每个请求到来,都需要在内存里创建一个实例,再通过该实例执行指定的方法。如果并发量大的话,内存里就会存在非常多功能上一模一样的对象。存在这些对象肯定会消耗内存,对于这些功能相同的对象可以在内存中仅创建一个,需要时都去调用,这么可以省下不少的内存。

单实例模式就是用来解决这个问题的,单例模式用来保证内存中仅存在一个实例!!!

对于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()

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

更多请参考:http://www.cnblogs.com/wupeiqi/articles/5017742.html

时间: 2024-08-27 20:23:33

python面向对象其他相关-异常处理-反射的相关文章

Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2.异常种类 3.异常其他结构 4.主动触发异常 5.自定义异常 6.断言 四.反射 五. 单例模式 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass ob

python 面向对象(五)约束 异常处理 MD5 日志处理

###############################总结###################### 1.异常处理 raise:抛出异常 try: 可能出现错误代码 execpt 异常类 as e: 异常处理 execpt 异常类 as e: 异常处理 else: 如果上面的代码没有报错,执行这里 finally: 收尾 自定义异常: 随便写个类. 继承Exception 2. 约束 父类和子类. 在父类中声明方法. 要求子类必须重写它 1. 抛出异常. raise NotImplem

Python之路【第五篇】:面向对象和相关

Python之路[第五篇]:面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 2 3 4 5 6 class Foo(object):     pass obj = Foo() isinstance(obj, Foo) 二.issubclass(sub, super) 检查sub类是否是 super 类的派生类 1 2 3 4 5 6 7 class F

Python基础(18)_面向对象程序设计2(反射、__str__、__del__、__item__系列)

一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstance(obj, Foo)) issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Foo): pass print(issubcla

Python面向对象之反射,双下方法

一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) class Foo:    f = '

Python面向对象反射,双下方法

一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) 对实例化对象的示例 class Foo

python 面向对象和类成员和异常处理

python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial diameter),极直径(polar diameter)''' def __init__(self,name,eqDiameter,poDiameter): self.name=name self.eqDiameter=eqDiameter #赤道直径 self.poDiameter=poDiamet

python面向对象07/异常处理

目录 python面向对象07/异常处理 1.异常错误分类 2.什么是异常? 3.异常处理 4.为什么要有异常处理? 5.异常处理的两种方式 5.1 if判断 5.2 try python面向对象07/异常处理 1.异常错误分类 语法错误: # if 2 > 1 # print(222) # # dic = {'name'; 'alex'} # tu = (2, 3, 4'' 6 ) 逻辑错误: # num = int(input('请输入数字')) # dic = {'name': '海狗',

Python 面向对象(下)

本篇博客承接自Python 面向对象(上) 四. 继承,实现,依赖,关联,聚合,组合 待补充 参考资料: https://www.cnblogs.com/chinxi/p/7349768.html 五. 特殊成员 待补充 参考资料: 类中的特殊成员方法 待补充 参考资料: https://www.cnblogs.com/chinxi/p/7349768.html 五. 特殊成员 待补充 参考资料: 类中的特殊成员方法 六. issubclass,type,isinstence各自的用法和区别 1