【问题标题】:Class inheritance python类继承python
【发布时间】:2022-01-15 21:23:53
【问题描述】:

以创建模型为例 学生班(models.Model)
name=models.charfield(),roll=models.integerfield()

同样, 在创建表单的情况下,类 newform(forms.Form) name=forms.charfield(),roll=forms.integerfield()

同样, 在创建序列化程序的情况下,类 serial(serializers.Serializer) name=serializers.charfield(),roll=serializers.integerfield()

我知道在每个类中,都会继承一个基类,但我很困惑,如果在每个场景中在一个类中创建不同类的不同对象,那么继承models.model,forms.Form,serializers是什么意思.Serializer 这些继承的类做什么?

【问题讨论】:

  • 您继承了他们的方法,因此您不必重新键入它们。你想要一个例子吗?

标签: python django django-models django-rest-framework python-django-storages


【解决方案1】:

Django 使用继承和对象组合这些 OOP 技术来实现可重用性。

让我们以你的第一堂课为例(为简单起见,我只保留了一个字段):

Student(models.Model):
   name = models.CharField(max_length=100)

Inheritance:

第一行Student(model.Model): 通过从Model 类继承来进行继承,使用该类您可以获得save()delete()clean_fields 等方法。现在您的Student 类可以重用这些方法。

Composition

第二行name = models.CharField(max_length=100) 通过创建对象即name 的类CharField 进行对象组合,使用它您可以获得checkget_internal_type 等方法。

所有这些内置类(ModelCharField e.t.c)都在文件中定义,即models.py,因此当您执行models.Model 时,您会从文件models.pymodels.CharField 中获得Model 类你 CharField 来自同一个文件的类。

【讨论】:

    【解决方案2】:

    通过从其他类继承,您可以访问它们的方法;

    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()
    

    从模型、表单等继承时...您从已经集成到框架中的对象继承,因此具有与框架一起使用的特定方法。例如模型将被注册到数据库中,表单“知道”如何正确渲染等等......

    当您从这些类继承时,您已经拥有一个包含所有这些方法的预构建对象。

    【讨论】:

    • 所以这些继承的类确实有一些自动启动的方法,对吧?
    • 是的,你是对的。在 python 中,当您需要确定实例化顺序(用于多重继承)时,请使用super(ClassToInstanciate, self).__init__(*args),否则应自动处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2018-10-05
    • 2016-06-28
    • 2011-09-26
    相关资源
    最近更新 更多