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

クラス属性ではなく、インスタンス属性を設定したいようです。

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

または...

this.user = get_logged_username()

nameクラスのすべてのインスタンスに最初に属性を持たせたい場合は、クラスをjohn宣言するときに作成します。

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

新しいインスタンスを作成するたびに、class 属性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 に答える
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、class 属性をオーバーライドする独自の属性を持つことができることに注意してください。

>>> 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 に答える