继承
__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)