super
转载文章,然后写的很不错,作为笔记
当存在继承关系的时候,有时候需要在子类中调用父类的方法,此时最简单的方法是把对象调用转换成类调用,需要注意的是这时self参数需要显式传递,例如:
- class FooParent(object):
- def bar(self, message):
- print message
- class FooChild(FooParent):
- def bar(self, message):
- FooParent.bar(self, message) #注意,self参数要显式传递
- FooChild().bar("Hello, World.")
输出:Hello, World.
其实,这可以用多态来改写,等价于
- class FooParent(object):
- def bar(self, message):
- print message
- class FooChild(FooParent):
- pass
- FooChild().bar("Hello, World.")
这样做有一些缺点,比如说如果修改了父类名称,那么在子类中会涉及多处修改,另外,Python是允许多继承的语言,如上所示的方法在多继承时就需要重复写多次,显得累赘。为了解决这些问题,Python引入了super()机制,例子代码如下:
- class FooParent(object):
- def bar(self, message):
- print(message)
- class FooChild(FooParent):
- def bar(self, message):
- super(FooChild, self).bar(message) #父类是FooParent,使用super(),自动获取FooParent的bar方法
- FooChild().bar('Hello, World.')
在来看两个例子,来熟悉super的用法:
- class FooParent(object):
- def __init__(self):
- self.parent='I\'m the parent.'
- print 'Parent'
- def bar(self, message):
- print message, 'from Parent'
- class FooChild(FooParent):
- def __init__(self):
- FooParent.__init__(self)
- print 'Child'
- def bar(self, message):
- FooParent.bar(self, message)
- print 'Child bar function. '
- print self.parent
- if __name__ == '__main__':
- fooChild = FooChild()
- fooChild.bar("HelloWorld")
用super()机制改写:
- class FooParent(object):
- def __init__(self):
- self.parent = 'I\'m the parent.'
- print 'Parent'
- def bar(self, message):
- print message, 'from Parent'
- class FooChild(FooParent):
- def __init__(self):
- super(FooChild, self).__init__()
- print 'Child'
- def bar(self, message):
- super(FooChild, self).bar(message)
- print 'Child bar function. '
- print self.parent
- if __name__ == '__main__':
- fooChild = FooChild()
- fooChild.bar("HelloWorld")
运行结果都是: