继承

__init__是python中的构造函数,用于属性的初始化。

如果在子类中定义了构造函数,python默认不会调用父类的构造函数,父类里的属性就不会集成到子类。

super

用于调用父类(超类)的一个方法

  1. class Person():
  2. def __init__(self, name='jab'):
  3. self.name = name
  4.  
  5. class Mate(Person):
  6. def __init__(self, age):
  7. self.age = age
  8.  
  9. class MateS(Person):
  10. def __init__(self, age):
  11. self.age = age
  12. super().__init__()
  13. #Mate类无法调用父类的name属性
  14. #MateS类中使用了super方法,可以调用父类的name属性

  

drf 序列化源码中的例子

  1. class Field:
  2. _creation_counter = 0
  3.  
  4. default_error_messages = {
  5. 'required': _('This field is required.'),
  6. 'null': _('This field may not be null.')
  7. }
  8. default_validators = []
  9. default_empty_html = empty
  10. initial = None
  11.  
  12. def __init__(self, read_only=False, write_only=False,
  13. required=None, default=empty, initial=empty, source=None,
  14. label=None, help_text=None, style=None,
  15. error_messages=None, validators=None, allow_null=False):
  16. self._creation_counter = Field._creation_counter
  17. Field._creation_counter += 1

  

  1. class BaseSerializer(Field):
  2.  
  3. def __init__(self, instance=None, data=empty, **kwargs): #初始化,传入instance,data参数
  4. self.instance = instance #instance,data给到self
  5. if data is not empty:
  6. self.initial_data = data
  7. self.partial = kwargs.pop('partial', False) #将额外的字典参数中,partial,context给到self,如果没有,给出默认值
  8. self._context = kwargs.pop('context', {})
  9. kwargs.pop('many', None) #将many这个key删除
  10. super().__init__(**kwargs) #继承父类的其余属性

  

子类重写父类方法时使用super

  1. class BaseSerializer():
  2. def __init__(self, value):
  3. self.value = value
  4.  
  5. @property
  6. def square(self):
  7. self._square = self.value * self.value
  8. return self._square
  9.  
  10. class Serlalizer(BaseSerializer):
  11. @property
  12. def square(self):
  13. ret = super().square
  14. return 'square=%d' %ret
  15.  
  16. serializer = Serlalizer(10)
  17. print(serializer.square)

  

  1. #父类
  2. @property
  3. def data(self):
  4. if hasattr(self, 'initial_data') and not hasattr(self, '_validated_data'):
  5. msg = (
  6. 'When a serializer is passed a `data` keyword argument you '
  7. 'must call `.is_valid()` before attempting to access the '
  8. 'serialized `.data` representation.\n'
  9. 'You should either call `.is_valid()` first, '
  10. 'or access `.initial_data` instead.'
  11. )
  12. raise AssertionError(msg)
  13.  
  14. if not hasattr(self, '_data'):
  15. if self.instance is not None and not getattr(self, '_errors', None):
  16. self._data = self.to_representation(self.instance)
  17. elif hasattr(self, '_validated_data') and not getattr(self, '_errors', None):
  18. self._data = self.to_representation(self.validated_data)
  19. else:
  20. self._data = self.get_initial()
  21. return self._data
  22.  
  23. #子类
  24. @property
  25. def data(self):
  26. ret = super().data
  27. return ReturnDict(ret, serializer=self)

  

super方法的更多相关文章

  1. super()方法的使用

    如果在子类中也定义了构造器,既_init_()函数,那么基类的构造器该如何调用呢? 方法一.明确指定 使用一个子类的实例去调用基类的构造器,在子类的构造器中明确的指明调用基类的构造器. class C ...

  2. super方法 调用父类的方法

    描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...

  3. python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)

    先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...

  4. [python] 在 python2和3中关于类继承的 super方法简要说明

    下面举一个例子,同样的代码使用 python2 和 python3 写的,大家注意两段程序中红色加粗的部分: python2的类继承使用super方法: #-*- coding:utf-8 -*- ' ...

  5. python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>

    MRO了解: 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就需要对当前类和基类进行搜索以确定方法所在的位置.而搜索的顺序就是所谓的「方法解析顺序」(M ...

  6. python's twenty day for me 继承 和 super()方法

    super(): 在单继承中就是单纯的寻找父类. 在多继承中就是根据子节点所在图 的mro顺序,找寻下一个类. 遇到多继承和super(): 对象.方法 1,找到这个对象对应的类. 2,将这个类的所有 ...

  7. super()方法详解

    目录 一.单独调用父类的方法 二.super() 方法基本概念 2.1 描述 2.2 语法 2.3 单继承使用super() 2.4 多继承使用super() 三.注意事项 四.练习 一.单独调用父类 ...

  8. python面向编程:类继承、继承案例、单继承下属性查找、super方法

    一.类的继承 二.基于继承解决类与类的代码冗余问题 三.在单继承背景下属性的查找 四.super的方法 一.类的继承 1.什么是继承? 在程序中继承是一种新建子类的方法的方式,新创建的类成为子类\派生 ...

  9. 【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>

    [转]python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法> MRO了解: 对于支持继承的编程语言来说,其方法(属性)可能定义 ...

随机推荐

  1. layer open type值类型

    参考:http://layer.layui.com/api.html layer提供了5种层类型: 0:信息框,默认 1:页面层 2:iframe层 3:加载层 4:tips层

  2. POJ 2947:Widget Factory 求同余方程

    Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 5173   Accepted: 1790 De ...

  3. Android 获取当前日期距离过期时间的日期差值的完整方法直接使用

    /*** * 获取当前日期距离过期时间的日期差值 * @param endTime * @return */public String dateDiff(String endTime) { Strin ...

  4. oracle jobs查看 sql及创建 jobs

    1.查看所有的 jobs select t.* from user_jobs t 2.创建 jobs declare job_id   pls_integer; begin sys.dbms_job. ...

  5. Java HotSpot(TM) Client VM 与 server VM 的配置

    在Linux 6.5 下安装Elasticsearch 出现错误: JVM is using the client VM [Java HotSpot(TM) Client VM] but should ...

  6. C 常用库函数memset,编译器宏定义assert

    一. 总览 1.1库函数 函数名 头文件 功能 原型 说明 syslog syslog.h 记录至系统记录(日志) void    syslog(int, const char *, ...) __p ...

  7. Python 矩阵相关

    Python 中矩阵运算主要使用numpy库.NumPy的主要对象是同种元素的多维数组.这是一个所有的元素都是一种类型.通过一个正整数索引的元素表格(通常是元素是数字).因此对于随机查找来说,比pyt ...

  8. i春秋-密码-IceCTF-Alien Message

    题目: 对应的解题图片: 解的时候,符号大点的是大写,小点的是小写. IceCTF{gOOd_n3wZ_3vERyoN3_1_L1k3_fU7ur4Ma_4nd_tH3iR_4maZ1nG_3As7e ...

  9. Django(十五)模板详解:模板标签、过滤器、模板注释、模板继承、html转义

    一.模板的基础配置及使用 [参考]https://docs.djangoproject.com/zh-hans/3.0/topics/templates/ 作为Web框架,Django提供了模板,用于 ...

  10. LINQ -- 匿名类型

    匿名类型注意事项: 匿名类型只能和局部变量配合使用,不能用于成员. 由于匿名类型没有名字,我们必须使用var关键字作为变量类型. 不能设置匿名类型对象的属性.编译器为匿名类型穿件的属性是只读的. 除了 ...