Python教程(八)和(九)
Python基础教程(八)和(九)
异常
-
Python用异常对象来表示异常情况。如果异常对象并未被处理或捕捉,程序就会使用回朔(一种错误信息)终止执行
-
raise语句:调用raise语句来引发异常。使用类时,程序会自动创建类的一个实例;如果捕捉到异常,却又想重新引发,则可调用不带参数的raise
-
内建异常类:
- Exception:所有异常的基类
- AttributeError:特性引用或赋值失败时引发
- IOError:打开不存在文件时引发
- IndexError:使用序列不存在的索引时引发
- KeyError:不存在键时
- NameError:找不到名字(变量)
- SyntaxError:代码为错误形式时
- TypeError:内建操作或者函数应用于错误类型的对象时
- ValueError:内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时引发
- ZeroDivisionError:除法或者模除操作的第二个参数为0
-
自定义异常类:从Exception类继承
class SomeCustomException (Exception) : pass
-
捕捉异常/诱捕:处理异常,使用try/except
如果没有捕捉异常,其就会被传到调用的函数中,如果在那里依然没有捕获,这些异常就会到程序的最顶层,即捕捉到在其他人的函数中所引发的异常
-
针对不同的异常情况,可使用多个except语句
try: x = input(); except ValueError: print "Value" except TypeError: print "Type"
-
用一个块捕捉两个异常,将这些异常作为元组列出:
try: x=input() except (TypeError, NameError): print "Type or Name"
-
捕捉异常:在except子句中访问异常对象本身,可使用两个参数(多个异常则将except字句中的一个参数使用为元组);主要使用在因为某种原因记录下错误
try: x=input() except (TypeError, NameError), e: print e
-
全捕捉:在except字句中忽略所有的异常类,则可捕捉所有异常
try: x=input() except: print "Something Error"
但是这样捕捉所有的异常是危险的,其会隐藏所有为想到且未准备处理的错误。使用except Exception,e`或者对 异常对象e进行一些检查
-
else:当不执行except语句时,可执行else语句
-
finally语句:其子句肯定会被执行,不管try子句是否发生异常
魔法方法和属性
-
使用新式类,则将赋值语句
_metaclass_type
放在模块最开始的地方或者子类化内建类object
;另外,Python3.0中没有旧式类,所有的类都会隐式地称为object的子类 -
构造方法:当一个对象被创建后,会立即调用构造方法;使用
_init_
创建构造方法;另外,尽量避免使用_del_
方法 -
重写一般方法:一个类从超类中继承行为方式或属性
class A: def hello(self): print: "Hello, I'm A" class B(A): def hello(self): print "Hello, I'm B"
-
特殊的构造方法:即继承超类原有的构造方法特性,又添加新的特性,可使用两种方式:
-
调用超类构造方法的未绑定版本
class SongBird(Bird) def _init_(self) Bird._init_(self) self.sound='Squawk' def sing(self) print self.sound
如果在调用一个实例的方法时,其方法的self会被自动绑定到实例上(称为绑定方法)。但是使用
Bird._init
就没有实例会被绑定,即未绑定方法 -
使用super函数:只能在新式类中使用(尽量使用新式类)
_metaclass_=type class SongBird(Bird): def _init_(self): super(SongBird, self)._init_() self.sound='Squawk' def sing(self) print self.sound
**使用新式类和super函数是比调用超类的未绑定的构造方法(或其他方法)更好的选择
-
-
基本的序列和映射规则:序列和映射是对象的集合,为了实现其基本的行为(规则),如果对象是不可变的,则需要使用两个魔法方法;如果是可变的,则需要使用4个魔法方法
- len(self) 返回集合中所含项目的数量
- getitem(self.key) 返回与所给键对应的值
- setitem(self.key, value) 按一定的方式存储key相关的value
- deliten(self.key) 对一部分对象使用del语句时被调用,同时必须删除和键相关的键
-
属性:使用访问器,通过getHeight,getWeight这样的名字得到或者重绑定一些特性
-
property函数:其创建了一个属性,其中访问器函数被用作参数,例如
size=property(getSize, setSize)
property函数可用0,1,3或4个参数调用
-
静态方法的定义没有self函数,且能够被类本身直接调用;类方法在定义时需要名为cls的类似于self的参数,类成员方法可以直接用类的具体对象调用
_metaclass_=type class MyClass: def smeth(): print 'Static method' smeth=staticmethod(smeth) def cmeth(cls) print 'static method' cmeth=classmethod(cmeth)
-
装饰器(decorator):对任何可调用的对象进行包装(不适用手动包装和替换方法),即能够用于方法也能够用于函数;使用@操作符,在方法(或函数)的上方将装饰器列出,从而指定一个或者更多的装饰器(多个装饰器在应用时的顺序与指定顺序相反)
class MyClass: @staticmethod def smeth(): print 'Static method' @classmethod def cmeth(cls) print ''class method'
定义了这些方法后,可像下面的例子使用
MyClass.smeth()
和MyClass.cmeth()
-
迭代器:
_iter_
表示重复做一些事情很多次,就像在循环中做的那样;实际上,也能对其他对象进行迭代,只要该对象实现了_iter_
方法class Fibs: def _init_(self) self.a=0 self.b=1 def next(self) self.a self.b=self.b self.a+self.b return self.a def _iter_(self) return self
_iter_
方法会返回一个迭代器(iterator),所谓的迭代器就是具有next方法的对象,在调用next方法时,迭代器会返回它的下一个值。即一个实现了_iter_
方法的对象是可迭代的,一个实现了next 方法的对象则是迭代器;另外,next(it)
等同于it.next()