一定有一种python3 super 用法 你不知道

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() 仍然可以有效的工作。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180119G054HT00?refer=cp_1026

扫码关注云+社区