Python【06】【基础部分】- 面向对象 2

 

面向对象相关

1、判定 isinstance(obj, cls)  、issubclass(sub, super)

class Father(object):
    pass

class Son(Father):
    pass

obj = Father()

# 检查obj是否是类的对象
print isinstance(obj,Father)
# 检查Son是否是父类的子类
print issubclass(Son,Father)

## True
## True

2、异常处理

(1)异常处理的目的

异常处理是为了在用户输入或程序执行错误输出一个友好的信息或提示。

# 主代码块内容
try:
    pass
    # 主动触发异常
    raise Exception(...)
# 详细异常处理
except IndexError,e:
    pass
# 完整异常处理
except Exception,e:
    pass
# 主代码执行完后,执行这段代码
else:
    pass
# 无论异常与否,都会执行该代码块
finally:
    pass

小例子

# Index Error
lis = ['tom',12]
try:
    lis[3]
except IndexError,e:
    print e

# key Error
dic = {'tom':12}
try:
    dic['kim']
except KeyError,e:
    print e

# value Error
name = 'tom'
try:
    int(name)
except ValueError,e:
    print e

(2)异常的种类

# 常用异常

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

(3)程序中未捕获到异常怎么办?

# 像这样的一段,很明显我的主代码块不正确,是个TypeError.但我却用了了IndexError
lis = ['tom',12]

try:
    int(lis)
# IndexError是捕获不到这种异常的
except IndexError,e:
    print e,"1"
except KeyError,e:
    print e,"2"
# 那有完整的异常处理是否可行呢
except Exception,e:
    print e,"3"
## int() argument must be a string or a number, not 'list'  3
# 看到结果好像是可以哎,那我以后直接写一个Exceptino完整异常处理不就可以了吗?
# 其实也是可以,但是不建议这样操作,要先把可预见到异常处理写在前面,最好加上完整异常处理,这样程序才会高效、稳定。

(4)另类的异常处理结构

try:     # 主代码块     pass
except KeyError,e:     # 异常时,执行该块     pass
else:     # 主代码块执行完,执行该块     pass
finally:     # 无论异常与否,最终执行该块     pass

(5)自定义与主动触发的异常

# 自定义异常类,基于Exception创建
class CustomException(Exception):
    # 构造方法,用于传入异常信息
    def __int__(self,msg=None):
        self.message = msg
    # 打印对象时,打印该方法的返回值
    def __str__(self):
        if self.message:
            return self.message
        else:
            return "自定义默认异常信息"

lis = ['tom',12]

try:
    lis[1]      # 主代码块没有异常,如果有异常便不会向下执行
    raise CustomException('主动触发异常信息')  # 主动触发异常,前提是主代码块没有异常,才会被执行.
except Exception,e:
    print e

(6)断言

# assert 用来声名某个条件是真的,如果非真,那么就返回一个异常
assert 1 == 2
lis = ['tom',12]
try:
    lis[3]
except IndexError,e:
    print e
## AssertionError

3、反射

python中的反射功能只针对类与对象来说,由以下四个内置函数提供,分别用于对对象内部执行
hasattr:检查是否含有某成员
getattr:获取成员
setattr:设置成员
delattr:删除成员
反射的目的是:通过字符串的形式来操作对象相关成员,一切事物都是对象,类是对象,模块也是对象

#!/usr/bin/env python
# coding:utf-8
__author__ = "QingPing"

class CLA(object):
    def __init__(self):
        self.name = 'tom'
    def func(self):
        return 'func'

obj = CLA()

# 检查类中是否有某成员(Trun/False)
hasattr(obj,'name')
hasattr(obj,'func')

# 获取类中的某成员
getattr(obj,'name')
getattr(obj,'func')

# 设置一个类中的成员,只放到内存中,不会修改原内容
setattr(obj,'age',12)
print obj.age
setattr(obj,'lam',lambda num:num + 1)

# 删除类中成员,也是只删除加载到内存中的数据
delattr(obj,'age')
delattr(obj,'name')
print obj.age

(1)其实访问对象成员时,还可以有不同的方式

class CLA(object):
    def __init__(self):
        self.name = 'tom'
    def func(self):
        return 'func'

obj = CLA()

# 常规的方式
# obj.name 或 obj.func()是去类中寻找相应的变量名,再通过变量名,找到内存的内容
print obj.name
print obj.func()

# 其实还可以使用反射的方式访问,只是得到类中变量name的值
print obj.__dict__['name']      # __dict__将对象中的成员以字典的方式输出
print getattr(obj,'name')       # getattr()调用对象中成员的内容

(2)web实例

在本地启一个web实例,利用getattr()获取另一个文件内的返回内容

#### home.py ###  

#!/usr/bin/env python
# coding:utf-8
__author__ = "QingPing"


def dir1():
    return "welcome to dir1"

def dir2():
    return "welcome to dir2"

def dir3():
    return "welcome to dir3"


### web_demo.py ###

#!/usr/bin/env python
# coding:utf-8
__author__ = "QingPing"

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]
    import home
    is_exist = hasattr(home, temp)
    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 80001..."
    httpd.serve_forever()

在浏览器访问:http://127.0.0.1:8001/文件的方法             

..

设计模式

1、单例模式

针对面向对象,单个实例,也就是在内在中存在一个实例,向外提供实例中的功能

web 调用实例

### web_demo.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']
    func_name = url.split('/')[1]
    import home
    # 在模块中检查是否有指定的函数
    is_exist = hasattr(home, func_name)
    # 如果存在指定函数,将函数结果取出并返回
    if is_exist:
        func = getattr(home, func_name)
        ret = func()
        return ret
    # 如果没有则输出错误信息
    else:
        return '404 not found'

if __name__ == '__main__':
    httpd = make_server('', 8002, RunServer)
    print "Serving HTTP on port 8002..."
    httpd.serve_forever()


### home.py ###

# web中改变调用当前模块
class A:
    __static_instance = None

    def __init__(self):
        pass

    @classmethod
    def instance(cls):
        if cls.__static_instance:
            return cls.__static_instance
        else:
            cls.__static_instance = A()
            return cls.__static_instance

    def search(self):
        pass

    def move(self):
        pass


def get_user():
    obj = A.instance()
    obj.search()
    print id(obj)
    return "a"

def del_user():
    obj = A.instance()
    obj.move()
    print id(obj)
    return "b"

2、通过面向对象特性,构造单例模式

# ########### 单例类定义 ###########
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() 。
posted @ 2015-12-14 17:54  YaYaTang  阅读(169)  评论(0编辑  收藏  举报