用户
搜索
  • TA的每日心情
    奋斗
    2017-8-8 12:39
  • 签到天数: 86 天

    连续签到: 1 天

    [LV.6]常住居民II

    管理员

    i春秋最帅男神-阿甫大哥哥

    Rank: 9Rank: 9Rank: 9

    68

    主题

    2218

    帖子

    2635

    魔法币
    收听
    0
    粉丝
    58
    注册时间
    2016-2-5

    楚核心白帽i春秋签约作者白帽传说春秋游侠秦燕魏赵齐突出贡献

    阿甫哥哥 管理员 i春秋最帅男神-阿甫大哥哥 楚 核心白帽 i春秋签约作者 白帽传说 春秋游侠 秦 燕 魏 楼主
    发表于 2017-10-3 20:04:29 671829
    本文原创作者:阿甫哥哥,本文属i春秋原创奖励计划,未经许可禁止转载
    0.jpg
    系列文章专辑:
    https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid=96

    本系列文章讲的都是Python2

    目录:
    1x05 继承(2)

    1x06 super函数

    1x07 错误与异常


    1x05 继承(2)
    咱们接着上次讲的,这次,咱们该讲多重继承了
    栗子
    [Python] 纯文本查看 复制代码
    # -*- coding: UTF-8 -*-  
    
    __metaclass__ = type
    
    class students:
        def speak(self):
            print "Hello momo"
        def height(self):
            print "MOMO's height is 1.70m"
    class Goddess:
            def color(self):
                    print "SHE like Blue"
    class demo(students,Goddess):
            pass
    if __name__ == '__main__':
        MOMO = demo()
        MOMO.speak()
        MOMO.color()

    55.jpg
    前面两个类,students和Goddess,然后第三个demo类就继承了前面两个类,然后实例化demo,就好了
    他的核心特征就是将父类的方法和属性全部承接到子类中
    那么,问题又来了,他的继承顺序是什么呢?
    [Python] 纯文本查看 复制代码
    # -*- coding:utf-8 -*-
    
    class P1(object):
        def foo(self):
            print 'p1-foo'
            
    class P2(object):
        def foo(self):
            print 'p2-foo'
        def bar(self):
            print 'p2-bar'
            
    class C1(P1,P2):
        pass
        
    class C2(P1,P2):
        def bar(self):
            print 'C2-bar'
            
    class D(C1,C2):
        pass 
        
    
    if __name__ =='__main__':
        print D.__mro__   #只有新式类有__mro__属性,打印继承顺序
        d=D()
        d.foo()
        d.bar()

    56.jpg
    顺序
    实例d调用foo()时,搜索顺序是 D => C1 => P1,
    实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2

    从结果看
    实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1
    实例d调用bar()时,搜索顺序是 D => C1 => C2
    这里呢,新式类的搜索方式是采用“广度优先”的方式去查找属性。


    1x06 super函数
    咱们看下,官方文档
    [Python] 纯文本查看 复制代码
    >>> super.__doc__
    'super(type, obj) -> bound super object; requires isinstance(obj, type)\nsuper(type) -> unbound super object\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\nTypical use to call a cooperative superclass method:\nclass C(B):\n    def meth(self, arg):\n        super(C, self).meth(arg)'
    >>> print super.__doc__
    super(type, obj) -> bound super object; requires isinstance(obj, type)
    super(type) -> unbound super object
    super(type, type2) -> bound super object; requires issubclass(type2, type)
    Typical use to call a cooperative superclass method:
    class C(B):
        def meth(self, arg):
            super(C, self).meth(arg)

    它的作用就是当子类里访问父类的同名属性,又不想直接引用父类的名字,因为可能要修改多次。这时候,我们就可以用到super函数
    他的作用呢
    super()函数根据传进去的两个参数具体作用如下:

    通过第一参数传进去的类名确定当前在MRO中的哪个位置。MRO(Method Resolution Order);
    通过第二个参数传进去的self,确定当前的MRO列表。


    super函数的语法:
    [Python] 纯文本查看 复制代码
    [/color][/size]
    [size=4][color=#000000]super(type[, object-or-type])
    举个栗子:
    [Python] 纯文本查看 复制代码
    # -*- coding: UTF-8 -*-
    
    class A(object):
      def name(self):
        print 'name is MOMO'
        #super(A,self).name()
    class B(object):
      def name(self):
        print 'name is YYYXY'
    class C(A,B):
      def name(self):
        print 'name is BaZong'
        super(C,self).name()
    if __name__ == '__main__':
      c = C()
      print c.__class__.__mro__
      c.name() 

    57.jpg


    如果去掉A类中注释,就可以看到当A执行后继续执行了B中的name()函数。如果B中仍然有super函数则会继续向上去查找object中是否有name()函数。
    [Python] 纯文本查看 复制代码
    # -*- coding: UTF-8 -*-
    
    class A(object):
      def name(self):
        print 'name is MOMO'
        super(A,self).name()
    class B(object):
      def name(self):
        print 'name is YYYXY'
    class C(A,B):
      def name(self):
        print 'name is BaZong'
        super(C,self).name()
    if __name__ == '__main__':
      c = C()
      print c.__class__.__mro__
      c.name() 

    58.jpg
    类这块,我就草草结束吧,剩下的去自学吧

    1x07 错误与异常

    Python中的标准异常
    BaseException        所有异常的基类
    SystemExit        解释器请求退出
    KeyboardInterrupt        用户中断执行(通常是输入^C)
    Exception        常规错误的基类
    StopIteration        迭代器没有更多的值
    GeneratorExit        生成器(generator)发生异常来通知退出
    StandardError        所有的内建标准异常的基类
    ArithmeticError        所有数值计算错误的基类
    FloatingPointError        浮点计算错误
    OverflowError        数值运算超出最大限制
    ZeroDivisionError        除(或取模)零 (所有数据类型)
    AssertionError        断言语句失败
    AttributeError        对象没有这个属性
    EOFError        没有内建输入,到达EOF 标记
    EnvironmentError        操作系统错误的基类
    IOError        输入/输出操作失败
    OSError        操作系统错误
    WindowsError        系统调用失败
    ImportError        导入模块/对象失败
    LookupError        无效数据查询的基类
    IndexError        序列中没有此索引(index)
    KeyError        映射中没有这个键
    MemoryError        内存溢出错误(对于Python 解释器不是致命的)
    NameError        未声明/初始化对象 (没有属性)
    UnboundLocalError        访问未初始化的本地变量
    ReferenceError        弱引用(Weak reference)试图访问已经垃圾回收了的对象
    RuntimeError        一般的运行时错误
    NotImplementedError        尚未实现的方法
    SyntaxError        Python 语法错误
    IndentationError        缩进错误
    TabError        Tab 和空格混用
    SystemError        一般的解释器系统错误
    TypeError        对类型无效的操作
    ValueError        传入无效的参数
    UnicodeError        Unicode 相关的错误
    UnicodeDecodeError        Unicode 解码时的错误
    UnicodeEncodeError        Unicode 编码时错误
    UnicodeTranslateError        Unicode 转换时错误
    Warning        警告的基类
    DeprecationWarning        关于被弃用的特征的警告
    FutureWarning        关于构造将来语义会有改变的警告
    OverflowWarning        旧的关于自动提升为长整型(long)的警告
    PendingDeprecationWarning        关于特性将会被废弃的警告
    RuntimeWarning        可疑的运行时行为(runtime behavior)的警告
    SyntaxWarning        可疑的语法的警告
    UserWarning        用户代码生成的警告

    异常的定义
    异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
    一般情况下,在Python无法正常处理程序时就会发生一个异常。
    异常是Python对象,表示一个错误。
    当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

    举几个栗子吧
    NameError
    [Python] 纯文本查看 复制代码
    >>> MOMO
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'MOMO' is not defined

    python虽然不需要在变量使用前声明类型,但必须对变量进行赋值

    SyntaxError
    [Python] 纯文本查看 复制代码
    >>> for i in range(1,100)
      File "<stdin>", line 1
        for i in range(1,100)
                            ^
    SyntaxError: invalid syntax

    这里呢,就是少加了一个 冒号
    一般发生在编译的时候,当编译到某一句话时,解释器不能将代码转化成python字节码就会报错
    TypeError
    [Python] 纯文本查看 复制代码
    >>> range("BaZong")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: range() integer end argument expected, got str.

    这个就很好理解了吧,range的是数字,不是字符串
    IOError
    [Python] 纯文本查看 复制代码
    >>> f = open("Bazong")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IOError: [Errno 2] No such file or directory: 'Bazong'

    这里如果你确定有文件,就必须要把路径写对,因为Python只会按照你给的位置找,找不到会报错
    这里呢,还有很多很多的错误,在学习的过程中难免会遇到,不要害怕,百度是个好东西
    下一节,咱们就来说如何处理异常
    这一小节,好像有点短,不要介意唉!!




    本帖被以下淘专辑推荐:

    Time will give me the answer
    发表于 2017-10-3 22:21:05
    等更新都等不及啦

    评分

    参与人数 1魔法币 +100 收起 理由
    阿甫哥哥 + 100 我就喜欢你这样的评论

    查看全部评分

    使用道具 举报 回复
    默默等待8
    使用道具 举报 回复
    发表于 2017-10-5 17:38:07

    等更新都等不及啦
    使用道具 举报 回复
    发表于 2017-10-10 10:25:33
    学习了大佬
    使用道具 举报 回复
    发表于 2017-10-11 10:41:40
    很好  学习了
    使用道具 举报 回复
    这标准异常 nice
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册