0

假设我有这个 django 模型

class Article(object):
       title = models.CharField(max_length=320)
       body  = models.CharField(max_length=320)
       def __init__(self):
              setattr(Article,"user",get_logged_username())

那只是示例代码

我只想知道,因为我设置的是类属性而不是实例属性,所以我的每个用户都将具有相同的user属性

像最初一样,john然后是其他人的浏览器,然后单击添加新文章

那么如果我检查我的user,那么他的用户名是否相同

4

4 回答 4

0

您在这里设置了一个属性,因为Article它是一个类。

这意味着您的所有实例都将共享此属性:

>>> class Article(object):
...     def __init__(self, user):
...         Article.user = user
...         

>>> article_john = Article('John')
>>> article_elli = Article('Ellie')                                                 

>>> article_john.user  # Modified by the second Article creation!
'Ellie'

但是请注意,对象(实例)可以有自己的user属性,它会覆盖类属性:

>>> article_john.user = 'This was initially John'
>>> article_ellie.user  # Unmodified, because it access the class attribute Article.user
'Ellie'

每个实例的属性只需使用self.user = get_logged_username().

于 2013-02-20T06:32:14.720 回答
0

看起来您想设置实例属性,而不是类属性。

setattr(self,"user",get_logged_username())

或者...

this.user = get_logged_username()

如果您希望该类的所有实例最初都具有name属性john,则只需在声明该类时创建 when 。

class Article:
    name = 'john'
于 2013-02-20T06:36:28.857 回答
0

请注意,每次创建新实例都会将类属性user设置为相同的值:

class Article(object):
       title = '111'
       body  = '222'
       def __init__(self):
              setattr(Article,"user",145)

aaaaaaa = Article()
print '# aaaaaaa = Article()  /done'
print '  aaaaaaa.__dict__ == %r ' % aaaaaaa.__dict__
print '  aaaaaaa.user == %r ' % aaaaaaa.user
print '  Article.user == %r\n' % Article.user

aaaaaaa.user = 2000
print '# aaaaaaa.user = 2000  /done'
print '  aaaaaaa.__dict__ == %r ' % aaaaaaa.__dict__
print '  aaaaaaa.user == %r ' % aaaaaaa.user
print '  Article.user == %r\n' % Article.user

Article.user = 'JUJU'
print "# Article.user = 'JUJU'  /done"
print '  aaaaaaa.__dict__ == %r ' % aaaaaaa.__dict__
print '  aaaaaaa.user == %r ' % aaaaaaa.user
print '  Article.user == %r\n' % Article.user

bbbbbbb = Article()
print '# bbbbbbb = Article()  /done'
print '  aaaaaaa.__dict__ == %r ' % aaaaaaa.__dict__
print '  aaaaaaa.user == %r ' % aaaaaaa.user
print '    bbbbbbb.__dict__ == %r ' % bbbbbbb.__dict__
print '    bbbbbbb.user == %r ' % bbbbbbb.user
print '    Article.user == %r ' % Article.user

结果

# aaaaaaa = Article()  /done
  aaaaaaa.__dict__ == {} 
  aaaaaaa.user == 145 
  Article.user == 145

# aaaaaaa.user = 2000  /done
  aaaaaaa.__dict__ == {'user': 2000} 
  aaaaaaa.user == 2000 
  Article.user == 145

# Article.user = 'JUJU'  /done
  aaaaaaa.__dict__ == {'user': 2000} 
  aaaaaaa.user == 2000 
  Article.user == 'JUJU'

# bbbbbbb = Article()  /done
  aaaaaaa.__dict__ == {'user': 2000} 
  aaaaaaa.user == 2000 
    bbbbbbb.__dict__ == {} 
    bbbbbbb.user == 145 
    Article.user == 145
于 2013-02-20T06:46:59.973 回答
0

设置类属性时,您可能希望将自己限制为将在该类的许多或所有实例之间共享的对象。对于每个实例将改变或唯一的值,在init () 方法中设置它们。

例如,您可能有一个在创建实例时使用的 threading.Lock 实例,然后是每个实例 threading.Lock 将用于每个实例的同步任务。

class Article:
    creation = threading.Lock
    count = 0

    def __init__ (self):
        Article.creation.acquire ()

        self.id = Article.count
        self.lock = threading.Lock

        Article.count += 1
        Article.creation.release ()


    def critical (self):
        self.lock.acquire ()

        # Something sensitive happens here.

        self.lock.release ()

回到你原来的问题,你可能想要:

class Article(object):

   def __init__(self):
       self.title = models.CharField(max_length=320)
       self.body  = models.CharField(max_length=320)
       self.user  = get_logged_username()
于 2013-02-20T06:49:53.277 回答