Python基础教程:异常、方法、属性和迭代器

发布时间:2017-09-02 15:53:32
Python基础教程:异常、方法、属性和迭代器 8. 异常 8.1 基本操作

抛出异常

raise Exception('异常演示') # 结果 Traceback (most recent call last): File "/xxx/07.python/project/demo/__init__.py", line 8, in raise Exception('异常演示') Exception: 异常演示

内建的异常

可以在exceptions模块找到,使用dir函数列出来。

>>> import exceptions >>> dir(exceptions) ['ArithmeticError', 'AssertionError', ...] 类名 描述
Exception 所有异常的基类
AttributeError 特性引用或赋值失败时引发
IOError 试图打开不存在文件(包括其他情况)时引发
IndexError 使用序列中不存在的索引
KeyError 使用映射中不存在的键
NameError 找不到名字(变量)
SyntaxError 代码为错误形式
TypeError 内建操作或函数应用于错误类型的对象
ValueError 内建操作或函数应用于正确类型的对象,但该对象使用不合适的值
ZeroDivisionError 除法或模除操作的第二个参数为0
8.2 自定义异常 class SomeCustomException(Exception): pass 8.3 捕捉异常

使用try/except:

try: x = input("first: ") y = input("second: ") print x/y except ZeroDivisionError, e: # 访问异常对象本身 print e except (TypeError, NameError): # 同时捕捉多个异常 # 向上抛出异常 raise # 结果1 first: 1 second: 0 The second number cant be zero! # 结果2 first: 1 second: "how" Traceback (most recent call last): File "xxx/__init__.py", line 11, in print x/y TypeError: unsupported operand type(s) for /: 'int' and 'str' # 结果3 first: 1 second: j Traceback (most recent call last): File "/xxx/__init__.py", line 10, in y = input("second: ") File "", line 1, in NameError: name 'j' is not defined 8.4 else、finally while True: try: x = input("first: ") y = input("second: ") print x / y except: print '捕捉所有异常' else: print '未发生异常时执行' break finally: print "总是执行" # 结果 first: 1 second: 捕捉所有异常 总是执行 first: 1 second: 2 0 未发生异常时执行 总是执行 8.5 新函数 函数 描述
warnings.filterwarnings(actiong, …) 用于过滤警告
9. 魔法方法、属性和迭代器 9.1 准备工作

新式类

赋值语句metaclass=type放在模块最开始,或者子类化object。

class NewStyle(object): 9.2 构造方法 class FooBar: def __init__(self): self.somevar = 42 f = FooBar() print f.somevar # 结果 42 9.2.1 重写构造方法

调用未绑定的超类构造方法

class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaah...' self.hungry = False else: print 'No, tks' class SongBird(Bird): def __init__(self): Bird.__init__(self) self.sound = 'Squawk!' def sing(self): print self.sound sb = SongBird() sb.sing() sb.eat() sb.eat() # 结果 Squawk! Aaaah... No, tks

使用super函数

__metaclass__ = type class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaah...' self.hungry = False else: print 'No, tks' class SongBird(Bird): def __init__(self): super(SongBird, self).__init__() self.sound = 'Squawk!' def sing(self): print self.sound sb = SongBird() sb.sing() sb.eat() sb.eat() # 结果 Squawk! Aaaah... No, tks 9.3 成员访问 9.3.1 基本的序列和映射规则

序列和映射是对象的集合。

__len_(self):返回集合中所含项目的数量。 __getitem__(self, key):返回与所给键对应的值。 __setitem__(self, key, value):设置和key相关的value。只能为可以修改的对象定义这个方法。 __delitem__(self, key):对一部分对象使用del语句时被调用,同时必须删除和元素相关的键。


注意:

对于序列,如果键是负数,从末尾开始计数。 如果键是不合适的类型,会引发TypeError异常。 如果序列是正确的类型,但超出范围,引发IndexError异常。
9.3.1 子类化列表、字典和字符串

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站建设公司 http://https://www.jingchucn.com/zt/wuhan_wangzhanjianshe/