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