2015-11-02 71 views
0

我定義我的Foo類爲:靜態成員變量沒有表現如預期 - Python的

class Foo(object): 
    # static member variables of the parent class Foo 
    is_logged = False 
    is_domain_set = False 

    def __init__(self, username, password): 
     # do something here. 

    def login(self, login_url): 
     # do the login ... 
     if self.login_successful(): 
      self.is_logged = True 
      self.is_domain_set = True 
      # Output `True` as expected 
      self.log.info("is_logged: %s" % self.is_logged) 
      self.log.info("is_domain_set: %s" % self.is_domain_set) 
      return 

class Bar(Foo): 
    # Foo is the parent class of Bar 
    super(Bar, self).__init__(username, password) 
    # Both are outputting `False` when it should be `True` 
    self.log.info("is_logged: %s" % self.is_logged) 
    self.log.info("is_domain_set: %s" % self.is_domain_set) 

    if not self.is_logged: 
     self.login(login_url) 

那麼他們在另外一個類中使用,Baz

class Baz(oject): 

    def __init__(self, username, password, login): 
     # -- not important for the problem. 
     self.foo = Foo(username, password) 
     # login for auth purpose 
     if not self.foo.is_logged: 
      self.foo.login(login_url) 

     # Now use some of the objects of the `Bar` class, which 
     # will do its job: 
     self.bar = Bar(username, password) 

程序流程就是這麼簡單。 Foo用於登錄等一些基本操作,而Bar用於其他特定操作。但是,我希望static變量可以在base class(每個類的一個實例)和它的child class之間共享。目的是讓is_loggedis_domain_set的行爲類似於Singleton。我究竟做錯了什麼?

表觀行爲是有一個爲Foo,一個用於Bar一個靜態變量,從Foo即使Bar繼承。但是,我試圖完成的是不同的。我想要FooBar共享相同的靜態變量。一個選項(壞)是有一個全局變量,但我試圖做到這一點。

+1

你想爲'is_logged_in'設置一個全局設置嗎?你能解釋你的用例嗎?這對我來說沒有意義。 –

+0

@ Two-BitAlchemist:我希望他們在不使用全局變量的情況下共享'is_logged_in'。說得通? – cybertextron

+0

這樣一次只能有一個用戶登錄?如果是這樣,我懷疑這是最好的辦法。 –

回答

2

您可能已經爲is_logged和is_domain_set定義了「靜態」變量(在Python中它們通常稱爲類屬性),但當您將其分配給self.is_logged時,您將立即用實例屬性覆蓋它們。

如果您只想分配給類變量,則需要執行self.__class__.is_logged = True