我将我的班级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_logged
和is_domain_set
表现得像Singleton
。我究竟做错了什么?
明显的行为是Foo
的静态变量和Bar
的静态变量,即使Bar
继承自Foo
。但是,我想要完成的是不同的。我希望Foo
和Bar
共享相同的静态变量。一个选项(坏)是有一个全局变量,但我试图没有这个。
答案 0 :(得分:2)
你可能已经定义了"静态"对于is_logged和is_domain_set,变量(在Python中它们通常称为类属性),但在分配给self.is_logged
时,您会立即用实例属性覆盖它们。
如果您只想分配给类变量,则需要执行self.__class__.is_logged = True
。