问题
- 如何使用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')
上下文环境
我的探索
- 我目前结论: 只要使用的继承, 几乎必写 super.__init__ ( 100% )
又要马儿跑(调用父类方法),又不喂马吃草(初始化父类),还嫌马儿懒(与父类耦合)?
话说回来:这是由马儿的特性,额,是继承的特性决定的。