静态成员变量的行为不符合预期 - Python

时间:2015-11-02 19:07:30

标签: python static

我将我的班级foo定义为:

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的静态变量,即使Bar继承自Foo。但是,我想要完成的是不同的。我希望FooBar共享相同的静态变量。一个选项(坏)是有一个全局变量,但我试图没有这个。

1 个答案:

答案 0 :(得分:2)

你可能已经定义了"静态"对于is_logged和is_domain_set,变量(在Python中它们通常称为类属性),但在分配给self.is_logged时,您会立即用实例属性覆盖它们。

如果您只想分配给类变量,则需要执行self.__class__.is_logged = True