akyou56 发表于 2015-4-25 10:24:40

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)  如此调用目标就很明确了。
  
页: [1]
查看完整版本: Python内置函数super的不便之处