zoukankan      html  css  js  c++  java
  • Python内置函数super的不便之处

    先看示例代码:

    class Top(object):
        def foo(self):
            print('Top')

    class Middle(Top):
        def foo(self):
            print('Middle')
            super(self.__class__, self).foo()

    class Bottom(Middle):
        pass

    b = Bottom()

    继续执行时如下这行代码时:

    b.foo()

    报RuntimeError: maximum recursion depth exceeded while calling a Python object。

    看来是由于递归的关系导致Python栈溢出了(CPython的函数栈很浅,使用递归要小心)。通过traceback信息和debug日志知道,根本原因是Middle.foo被递归执行了,为什么会出现这样的错误呢?这段代码很普通嘛,只是最底层的子类想要使用中间父类的方法而已,这种场景太常见了,答案在super的机制上,super(type, object).method()会以实例object调用类型type的父类所定义的方法method。

    b.foo()的方法查找顺序是:

    1、查找实例本身

    2、实例的类

    3、父类Middle

    执行到父类的foo处,此时代码中的self所指代的实例是Bottom的实例,self.__class__是Bottom,杯具就在这里了,super(self.__class__, self).foo()会反复的调用Middle.foo……

    要解决这个问题很简单,老老实实用super没出现前的写法即可:

    class Middle(Top):
        def foo(self):
            print('Middle')
            Top.foo(self)

    如此调用目标就很明确了。

  • 相关阅读:
    涂鸦
    触发事件续
    触摸事件基本介绍
    背景平铺
    屏幕截图
    图片的裁剪
    图片水印
    UIKit绘图方法
    Java范型学习笔记
    《Head first设计模式》学习笔记
  • 原文地址:https://www.cnblogs.com/inside/p/2067677.html
Copyright © 2011-2022 走看看