zoukankan      html  css  js  c++  java
  • super方法

    继承

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

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

    super

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

    class Person():
        def __init__(self, name='jab'):
            self.name = name
    
    class Mate(Person):
        def __init__(self, age):
            self.age = age
    
    class MateS(Person):
        def __init__(self, age):
            self.age = age
            super().__init__()
    #Mate类无法调用父类的name属性
    #MateS类中使用了super方法,可以调用父类的name属性
    

      

    drf 序列化源码中的例子

    class Field:
        _creation_counter = 0
    
        default_error_messages = {
            'required': _('This field is required.'),
            'null': _('This field may not be null.')
        }
        default_validators = []
        default_empty_html = empty
        initial = None
    
        def __init__(self, read_only=False, write_only=False,
                     required=None, default=empty, initial=empty, source=None,
                     label=None, help_text=None, style=None,
                     error_messages=None, validators=None, allow_null=False):
            self._creation_counter = Field._creation_counter
            Field._creation_counter += 1
    

      

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

      

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

    class BaseSerializer():
        def __init__(self, value):
            self.value = value
    
        @property
        def square(self):
            self._square = self.value * self.value
            return self._square
    
    class Serlalizer(BaseSerializer):
        @property
        def square(self):
            ret = super().square
            return 'square=%d' %ret
    
    serializer = Serlalizer(10)
    print(serializer.square)
    

      

        #父类
        @property
        def data(self):
            if hasattr(self, 'initial_data') and not hasattr(self, '_validated_data'):
                msg = (
                    'When a serializer is passed a `data` keyword argument you '
                    'must call `.is_valid()` before attempting to access the '
                    'serialized `.data` representation.
    '
                    'You should either call `.is_valid()` first, '
                    'or access `.initial_data` instead.'
                )
                raise AssertionError(msg)
    
            if not hasattr(self, '_data'):
                if self.instance is not None and not getattr(self, '_errors', None):
                    self._data = self.to_representation(self.instance)
                elif hasattr(self, '_validated_data') and not getattr(self, '_errors', None):
                    self._data = self.to_representation(self.validated_data)
                else:
                    self._data = self.get_initial()
            return self._data
    
    
        #子类
        @property
        def data(self):
            ret = super().data
            return ReturnDict(ret, serializer=self)
    

      

  • 相关阅读:
    PhoneGap打包webApp
    mysql触发器实例说明
    mysql索引总结
    python:生成器
    python:装饰器
    python:局部变量与全局变量
    python:函数
    python:文件操作
    python:集合及其运算
    python:字符串常用函数
  • 原文地址:https://www.cnblogs.com/jabbok/p/11284144.html
Copyright © 2011-2022 走看看