Python中关于super的使用疑惑?

问题

  1. 如何使用super ( 我想: 这应该不单是python里面的问题, 其他语言也有 )

相关代码

  • 我的代码 + 问题
from __future__ import (absolute_import, unicode_literals)


class Super(object):
    def __init__(self, f1, f2, f3):
        self._f1 = f1
        self._f2 = f2
        self._f3 = f3

        self._f4 = 'f4'
        self._f6 = 'f6'
        self._f7 = 'f7'
        self._f8 = 'f8'
        self._f9 = 'f9'

    def get_str(self):
        return 'str'

    def get_str2(self, s):
        f1 = self._f1
        return 'str' + s + f1


class Sub(Super):
    def __init__(self, f1, f2, f3, f4, f5):
        # ? 在此处调用super, 会隐式获得3个实例属性, self._f1, self._f2, self._f3
        # 但是这并不是我们想要的( 因为这个过程对我们并不透明 )
        super(Sub, self).__init__(f1, f2, f3)

        self._f4 = f4
        self._f5 = f5

    # override
    def get_str2(self, s):
        # ? 在此处调用super, 假如super的方法里面使用self.xxx, 但是我们又没有, 就会异常
        # 这反向推导出: 我们必须在 init 方法中写super.__init__
        super_result = super(Sub, self).get_str2(s)

        return super_result + 'sub'

# 因此我们可能会得出一个朴素的结论:
# 如果继承, 则几乎必须在子类的__init__方法中写super, 因为你无法控制子类的方法中会使用父类方法
# 逻辑推导链条如下:
# 我要复用父类的方法-->但是父类方法中使用对应的self.xxx, 但是我却没有这个属性--> 我必须有这个属性--> 我必须在构造函数中将其准备好
# --> 我会隐式得到一堆 self.xxx属性(比如, 有可能十几个), 但是这个过程对我并不透明, 甚至很多属性我都使用不到(毕竟我无法控制父类)
# --> 我与父类耦合在一起了

if __name__ == '__main__':
    sub = Sub('1', '2', '3', '4', '5')

    sub.get_str2('s')

上下文环境

  • 2.7 <= python <= 3.5

我的探索

  1. 我目前结论: 只要使用的继承, 几乎必写 super.__init__ ( 100% )
阅读 1.8k
1 个回答

又要马儿跑(调用父类方法),又不喂马吃草(初始化父类),还嫌马儿懒(与父类耦合)?
话说回来:这是由马儿的特性,额,是继承的特性决定的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题