加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

澄清/何时/何地在django / python中使用super

发布时间:2020-12-20 12:40:50 所属栏目:Python 来源:网络整理
导读:实际上我们知道super用于查找“父类”并返回其对象,例如/ using self .__ class __.__ mro__ 我很困惑的是什么时候使用它? 假设我们有一个示例模型代码,如下所示 VERSION_1 class Example(models.Model): name = models.CharField() age = models.IntegerFi
实际上我们知道super用于查找“父类”并返回其对象,例如/ using self .__ class __.__ mro__

我很困惑的是什么时候使用它?

假设我们有一个示例模型代码,如下所示

VERSION_1

class Example(models.Model):
    name = models.CharField()
    age  = models.IntegerField()

    def save(self,**args,**kwargs):
        obj = super(Example,self).save(self,**kwargs)
        obj.name = "name changed"
        obj.age = "age changed"
        return obj

VERSION_2

class Example(models.Model):
    name = models.CharField()
    age  = models.IntegerField()

    def save(self,**kwargs):
        self.name = "name changed"
        self.age = "age changed"
        obj = super(Example,**kwargs)
        return obj

所以我们可以在上面观察

在version_1中,我首先调用super并对字段进行了修改并返回了obj

在版本_2中,我修改了字段,之后调用了super并返回了obj

那么在修改字段之前和之后调用super时会发生什么?

最后我想知道/确认的是

>在django表格/模型中使用何处/为何精确超级.
>在django / python中使用它们的确切概念是什么(如果我理解错了).

解决方法

您的Example类是Model的子类.这意味着,该示例继承了Model中的所有函数.

请看以下内容:

class Example():
    pass

example = Example()
#let's try to save it
example.save()

Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
AttributeError: Example instance has no attribute 'save'

现在继承.

class Parent():
    def save(*args,**kwargs):
        print "saving now"

class Example(Parent):
    pass

example = Example()
#since Example has no save method,it inherits the Parent's save method.
example.save()
"saving now"

如果覆盖Example类中的save()方法,则不会调用Parent的save方法.

class Example(Parent):
        def save(self,*args,**kwargs):
            print "i know how to save on my own now"

   example = Example()
   example.save()
   "i know how to save on my own now"

如果您选择调用super,则调用Parent的save函数以及您自己的save()实现.

class Example(Parent):
         def save(self,**kwargs):
              super(Example,self).save(*args,**kwargs)
              print "i know how to save on my own now"

   example = Example()
   example.save()
   "saving now" #from parent
   "i know how to save on my own" #from example

这同样适用于您继承的所有djangos类.实际上,实施更复杂.您可以在github查看模型定义.

如果您感到激动,可以使用此talk潜入django ORM

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读