请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

既然是调用类属性为什么要用shelf呢?

class CityDict(models.Model):
   name = models.CharField(max_length=20, verbose_name=u"城市")
   desc = models.CharField(max_length=200, verbose_name=u'描述')
   add_time = models.DateTimeField(default=datetime.now, verbose_name=u'添加时间')

   class Meta:
       verbose_name = u'城市'
       verbose_name_plural = verbose_name

   def __unicode__(self):
       return self.name

改成这样写可以吗

 class CityDict(models.Model):
   name = models.CharField(max_length=20, verbose_name=u"城市")
   desc = models.CharField(max_length=200, verbose_name=u'描述')
   add_time = models.DateTimeField(default=datetime.now, verbose_name=u'添加时间')

   class Meta:
       verbose_name = u'城市'
       verbose_name_plural = verbose_name

   def __unicode__(cls):
       return cls.name 


正在回答

2回答

因为是调用对象本身的属性

0 回复 有任何疑惑可以回复我~
  • 提问者 赵日天l #1
    对象的属性不是写在init里面吗
    回复 有任何疑惑可以回复我~ 2017-10-19 22:53:23
  • Jaxon 回复 提问者 赵日天l #2
    回顾了下基础,现在重新回答本题,将self改为cls其实是一样的,因为依旧是实例方法(self命名是遵循PEP8规范,所以写abc也是不报错的);实例方法调用的属性是实例本身没有的就会自动调用类属性,至于为什么不用类名调用,我想或许是因为方便,或许是因为习惯,又或许是别的原因,到底是为啥我也不晓得。希望这次的回答对你有所帮助~
    回复 有任何疑惑可以回复我~ 2017-10-20 13:19:01
  • 提问者 赵日天l #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2017-10-20 19:50:36
bobby 2017-10-20 13:36:59

首先, 这个问题很好, 这个是python的面向对象知识了,首先

    1. 类中定义的__unicode__方法一定是会被对象调用而不是被类调用,所以不管你的参数是cls还是self,这两个都是变量名而已, 实际传递进去的都是对象

    2. 对象调用.name涉及到python中属性的查找顺序, 会首先查找对象的name熟悉,如果没有才会去查到类的name值, 这里你能看到类的name值是一个CharField对象而不是具体的值, 实际上model的实例在你取到值的时候已经把name的值放到了实例对象中所以会优先获取到对象的值而不是类

    

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信