Наследование классов python
В случае создания модели, например
class Student(models.Model)
name=models.charfield(),roll=models.integerfield()
аналогично, В случае создания формы, class newform(forms.Form) name=forms.charfield(),roll=forms.integerfield()
аналогично, В случае создания сериализатора, класс serial(serializers.Serializer) name=serializers.charfield(),roll=serializers.integerfield()
Я понял, что в каждом классе наследуется базовый класс, но меня смущает, что если внутри класса в каждом сценарии создаются разные объекты разных классов, то какой смысл наследовать models.model, forms.Form, serializers.Serializer, что делают эти наследуемые классы?
Наследуясь от других классов, вы получаете доступ к их методам;
Class A(object):
def _print(self):
print('Class A')
Class B(A):
def other_print(self):
print('Class B')
if __name__ == "__main__":
a, b = A(), B()
a._print()
b._print()
b.other_print()
При наследовании от модели, формы и т.д.... Вы наследуете от объекта, который уже интегрирован во фреймворк и, таким образом, имеет определенные методы для работы с фреймворком. Например, модель будет зарегистрирована в базе данных, форма "знает", как правильно отрисовывать и т.д...
Когда вы наследуете от этих классов, у вас уже есть заранее созданный объект со всеми этими методами.
Django использует наследование, а также композицию объектов, которые являются техниками ООП для повторного использования.
В качестве примера возьмем ваш первый класс (для простоты я сохранил только одно поле):
Student(models.Model):
name = models.CharField(max_length=100)
Первая строка Student(model.Model):
делает наследование, наследуя от класса Model
, используя который вы получаете такие методы как save()
, delete()
, clean_fields
и т.д. Теперь ваш класс Student
может повторно использовать эти методы.
Вторая строка name = models.CharField(max_length=100)
выполняет композицию объектов, создавая объект name
класса CharField
, используя который вы получаете методы check
, get_internal_type
и т.д.
Все эти встроенные классы (Model
, CharField
и т.д.) определены в файле models.py
, поэтому, когда вы делаете models.Model
, вы получаете Model
класс из файла models.py
, а models.CharField
дает вам CharField
класс из того же файла.