您的位置:首页 > 编程语言 > Python开发

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

2016-07-02 09:43 746 查看
本节主要内容:

1.面向对象中的成员

2.成员修饰符

3.特殊成员

4.异常处理

5.设计模式之单例模式

一.面向对象中的成员(类的成员)

类的成员总共可以分为3大类,每类中有不同的分支。

1.总述,基本分类

如下图所示: 类成员包括字段,方法,和属性

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

更多异常


更多异常种类
应用实例:

IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]


dic = ["zhaowencheng", 'wangmeimei']
try:
dic[10]
except IndexError as ex:
print(ex)
#显示如下:
list index out of range

Process finished with exit code 0


KeyError 试图访问字典里不存在的键


dic = {"aaa":"111", "bbb":"222"}
try:
dic["ccc"]

except KeyError as ex:
print(ex)


ValueError 传入一个调用者不期望的值,即使值的类型是正确的


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

###显示
invalid literal for int() with base 10: 'hello'

Process finished with exit code 0


2.进阶异常处理:

对于上面叙述的所有例中,所有的异常处理只能处理指定的异常,如KeyError只能捕捉访问字典中不存在的key时的异常,却无法捕捉ValueError的类型的异常。当捕获不到对应的异常时

程序依然回直接报错,达不到想要的效果如下:

s1 = 'hello'
try:
int(s1)
except KeyError as e:
print(e)

#由于未能捕获到正确的err程序依然回直接报错,显示如下:
Traceback (most recent call last):
File "/Users/wenchengzhao/PycharmProjects/s13/day8/temp.py", line 328, in <module>
int(s1)
ValueError: invalid literal for int() with base 10: 'hello'

Process finished with exit code 1


关于如上的内容应该改如何操作呢,有一种笨的方法如就是捕获多种类型的err,

s1 = 'hello'
try:
int(s1)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
except IndexError as e:
print(e)
.
.
.                            #写上更多的 err 类型。


但是这种方法非常笨拙,而且很难写全面,其实python中有一个万能异常Exception,他能捕获各种异常

s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)

##显示如下
invalid literal for int() with base 10: 'hello'

Process finished with exit code 0


那么既然后万能异常其它异常存在的意义是什么呢?

万能异常时这样使用的:对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行。如下:

s1 = 'hello'
try:
int(s1)
except KeyError as e:
print ("键错误")
except IndexError as e:
print ('索引错误')
except Exception as e:
print ('错误')


3.其它异常结构

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


执行顺序:



4.主动触发异常

try:
raise Exception('错误了。。。(wencheng)')
except Exception  as  e:
print (e)

#显示如下:
错误了。。。(wencheng)

Process finished with exit code 0


5.自定义异常

class ZhaowenchengException(Exception):
def __init__(self, msg):
self.message = msg

def __str__(self):
return self.message

try:
raise ZhaowenchengException('我的异常')
except ZhaowenchengException as e:
print(e)

#显示如下
我的异常

Process finished with exit code 0


6断言

python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。

语法简单如下:

# assert 条件

assert 1 == 1

assert 1 == 2


五.设计模式之 ---- 单例模式

简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并提供全局访问点。

下面用pytho代码来实现一个单例模式

class Foo:

instance = None                 #标示用于判断实例是否存在

def __init__(self,name):        #构造方法
self.name = name
@classmethod                    #类方法
def get_instance(cls):          #将类名作为参数传递进来
if cls.instance:            #判断实例是否存在
return cls.instance     #如果存在直接返回,不在创建,确保单实例
else:
obj = cls()
cls.instance = obj
return obj              #返回对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: