面向对象有这个强大特点和作用, 著名的三大特点:封装, 继承, 多态

这篇博客写的是super()的简单理解和使用

今天在读restframework的源码的时候, 发现源码中使用了super, 依以此为入口, 重写了django的as_view()

在代码执行的过程中既执行了自己的as_view()有执行了django的as_view()

super()能做什么?

之前的理解就是, 使用super()可以在子类中调用父类的方法或属性, 可能你会说, 子类本来就可以调用父类中所有非私有的属性或方法,

而我现在说的是, 当子类中实现了某个方法, 父类中也有这个方法, 当你调用这个方法时, 既想执行子类的又想执行父类的, 在这种情况下

就可以使用super()

super()怎么用的

class A(object):
def __init__(self, name, age):
self.name = name
self.age = age
print("class A") class B(A):
def __init__(self, name, age):
super().__init__(name, age)
print("class B") class C(B):
def __init__(self, name, age):
# 方式一
super().__init__(name, age)
# 相当于 super(C, self).__init__(name, age)
# 默认是从当前类的父类开始往上找__init__() # 方式二
# 指定从当前类的某个父类中开始往上找
super(B, self).__init__(name, age)
print("class C") c = C("sath", 37)

定义了三个类, 继承关系为 C 继承 B 继承 A

定C类进行实例化的时候, 要先执行__init__()[__new__先不说],

C类中有__init__()方法, 所以就会执行C类中的__init__()

但是在C类自己的__init__()中却使用了super(). 并且是   点.__init__()

这就表示要去执行父类的__init()方法

super()有两中使用方法

方法一

super().__init__()

默认执行当前类的父类中的方法, 并且将当前类的实例对象self传了进去

其实就相当于super(C, self).__init__()

父类中的__init__(self), 中的self就是super()传进去的self,

方法二

super(B, self)>__init__()

其实和方法一一样, 就是指定的父类不一样了, 你可以指定执行那个父类的__init__()

前提是必须是当前这个类的父类

这样执行的执行的话, 参数就会灵活很多

restframework中对super()的应用实例

先来看一下源码

@classmethod
def as_view(cls, **initkwargs):
if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
def force_evaluation():
raise RuntimeError(
'Do not evaluate the `.queryset` attribute directly, '
'as the result will be cached and reused between requests. '
'Use `.all()` or call `.get_queryset()` instead.'
)
cls.queryset._fetch_all = force_evaluation view = super(APIView, cls).as_view(**initkwargs)
super().__init__()
view.cls = cls
view.initkwargs = initkwargs return csrf_exempt(view)

现在就来看这行代码 view = super(APIView, cls).as_view(**initkwargs)

写了一个CBV, 视图继承了APIView

当请求进来之后, 进行路由匹配然后调用视图函数, CBV会执行as_view()

我是的路由是这样式的

url(r'^auth/', views.AuthView.as_view())

AuthView就是视图类, 继承了APIView, 当调用as_view()时, 先去自己的类中找as_view, 发现没有, 然后去父类中找

上面的as_view()代码就是APIViwe类中的as_view(), APIView其实也继承了View

发现as_view()是一个类方法, 怪不得在路由中使用类去调用呢, 这个样就能得到视图类的类空间了

因为在View中需要用视图类, 然后对视图类进行了实例化, 通过这个实例在加上反射获取和用户请求方式同名的函数并执行

上面就是super()在restframework中的应用

python中的super怎么用?的更多相关文章

  1. python中的super( test, self).__init__()

    python中的super( test, self).__init__() 对继承自父类的属性进行初始化 首先找到test的父类(比如是类A),然后把类test的对象self转换为类A的对象,然后“被 ...

  2. 第7.22节 Python中使用super调用父类的方法

    第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...

  3. python中的super是什么?

    技术背景 python中的super,名为超类,可以简单的理解为执行父类的__init__函数.由于在python中不论是一对一的继承,还是一子类继承多个父类,都会涉及到执行的先后顺序的问题.那么本文 ...

  4. Python中的super函数,你熟吗?

    摘要:经常有朋友问,学 Python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么? 本文分享自华为云社区<Python中的super函数怎么学,怎么解 ...

  5. python中的super()是什么?

    技术场景:python中的super,名为超类,可以简单的理解为执行父类的__init__函数.由于在python中不论是一对一的继承,还是一子类继承多个父类,都会涉及到执行的先后顺序的问题.那么本文 ...

  6. python 中的super()继承,搜索广度为先

    一.python中类的继承 1.1 单继承 在python 中我们可以这样来定义一个类:及继承它的子类 class Father: def __init__(self, mes): #1 父类的ini ...

  7. Python中的super()用法

    Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this,比如:C#),用于传递对象本身,而在调用的时候则不 必显式传递,系统会自动传递. 今天我们介绍的主角是su ...

  8. Python中的super().__init__()

    Python里的super().init()有什么用? 简单的说super().__init__(),就是继承父类的init方法,同样可以使用super()去继承其他方法. 下面是三种不同的继承.调用 ...

  9. 认识python中的super函数

    需求分析 在类继承中,存在这么一种情况: class Human(object): def Move(self): print("我会走路...") class Man(Human ...

随机推荐

  1. git 回滚到上个版本命令以及忽略某些文件提交

    1.git回滚到上个版本 git reset --hard FETCH_HEAD 2.git忽略某些文件的提交 以前是用默认的.gitignore 然后再里面默认某些文件不提交.但是有个问题,.git ...

  2. bootstrap 默认显示1899问题

    今天使用bootstrap的 dateTimePicker控件时候,又碰到了去年的 显示 1899年的问题,之前解决过,但是忘记了.就记得 他的代码里面有一段是 说格式不正确或者 时间格式小于某个值时 ...

  3. androidwebview timeout

    public class MyWebViewClient extends WebViewClient { boolean timeout; public MyWebView() { timeout = ...

  4. Python unittest模块心得(一)

    关于unittest模块的一些心得,主要是看官网的例子,加上一点自己的理解,官网地址:https://docs.python.org/3.6/library/unittest.html 基础概念介绍: ...

  5. Jsp Cookie的创建与读取 标签: cookiejsp 2016-11-17 15:14 61人阅读 评论(0)

    Cookie.jsp <%@ page language="Java" import="java.util.*" pageEncoding="u ...

  6. oam系统安装,windows操作系统注册列表影响系统安装

    windows注册列表可能会影响到系统的安装,本次安装oam10g版本,安装后没有问题,但是在配置oam和weblogic portal单点登录时在weblogic portal中访问oid和oam的 ...

  7. SAP C/4HANA与人工智能和增强现实(AR)技术结合的又一个创新案例

    今天这篇迟到的文章,来自我的同事Aviva. 去年SAP C/4HANA发布之后,SAP的从业者们可能或多或少都读过一些来自SAP官方渠道,比如微信公众号"SAP天天事"发布的一些 ...

  8. nodejs+postgis实现搜周边

    利用nodejs搭建服务器,并连接PostgreSQL数据库,利用前端传过来的中心点坐标和搜索半径,进行空间查询,实现简单的搜周边,下面是实现流程和nodejs的代码: app.post('/tose ...

  9. Mutual Training for Wannafly Union #2

    codeforces 298A. Snow Footprints 分类讨论三种情况: ①..RRRRRR…  ②..LLLLLLL… ③..RRRLLLL.. //AC by lwq: #includ ...

  10. torch.backend.cudnn.benchmark

    大部分情况下,设置这个 flag 可以让内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题. 一般来讲,应该遵循以下准则: 如果网络的输入数据维度 ...