1,为了调用父类(超类)的一个方法,可以使用 super() 函数,比如
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
"""
@Time: 2018/1/18
@Author: songhao
@微信公众号: zeropython
@File: superclass.py
"""
# 创建一个One类
classOne(object):
defnew_one(self):
print("new_one func")
classTwo(One):
# 创建 Two 继承 One
def__init__(self):
super().new_one()
# 调用 One 类中的 new_one 方法
defnew_two(self):
print("newtp")
super().new_one()
if__name__=='__main__':
t=Two()
# 实例化 Two
t.new_two()
# 调用new_two
返回结果是:
2. super() 函数的一个常见用法是在 __init__() 方法中确保父类被正确的初始化了:
classA:
def__init__(self):
self.x=
classB(A):
def__init__(self):
super().__init__()
self.y=1
defget_x_y(self):
print(self.x ,self.y)
返回结果是:
0 1
3. super() 的另外一个常见用法出现在覆盖Python特殊方法的代码中,比如:
classProxy:
def__init__(self, obj):
self._obj=obj
# Delegate attribute lookup to internal obj
def__getattr__(self, name):
returngetattr(self._obj, name)
# Delegate attribute assignment
def__setattr__(self, name, value):
ifname.startswith('_'):
super().__setattr__(name, value)
# Call original __setattr__
else:
setattr(self._obj, name, value)
在上面代码中,__setattr__() 的实现包含一个名字检查。 如果某个属性名以下划线(_)开头,就通过 super() 调用原始的 __setattr__() , 否则的话就委派给内部的代理对象 self._obj 去处理。 这看上去有点意思,因为就算没有显式的指明某个类的父类, super() 仍然可以有效的工作。
领取专属 10元无门槛券
私享最新 技术干货