[英]Python class inheritance and sharing variables
我有一个关于访问两个类之间的变量的问题,其中一个是基类。 我有一个我正在编写的程序,其中有一个“设置”变量,它在几个类之间共享。 这是它的简化版本。
此代码段有效。 当我运行它时,我可以从 Top 类访问 run(),并且两个类都可以访问 self.settings,当我从 go() 打印出来时,它包含“a”和“b”键。
问题是,pylint 和我的 IDE 说“'Base' 的实例没有'settings' 成员”。 我的理解是因为它没有在 Base.xml 中初始化。 初始化()。
class Base:
def __init__(self):
self.settings["b"] = False
def run(self):
print("RUN")
class Top(Base):
def __init__(self):
self.settings = dict(a=True)
Base.__init__(self)
def go(self):
print(self.settings)
x = Top()
x.go()
x.run()
这是一个稍作修改的版本,我将两次从 Top 传递到 Base 的“self”,并使用“main.settings”而不是 self.settings。 Pylint 和我的 IDE 都对此抱怨。 我显然将 self 实例传递给它以共享,所以我理解这一点。
class Base:
def __init__(self, main):
main.settings["b"] = False
def run(self):
print("RUN")
class Top(Base):
def __init__(self):
self.settings = dict(a=True)
Base.__init__(self, self)
def go(self):
print(self.settings)
x = Top()
x.go()
x.run()
我不明白,实现这一目标的正确方法是什么? 另一个选择当然是传递设置变量本身。 但是,我有几个变量和可能的方法都需要由两个类使用,因此传递“自我”似乎是最好的选择。
您应该在基类而不是子类中创建self.settings
。 然后孩子可以在调用基础的__init__()
方法后将其键添加到它。
class Base:
def __init__(self):
self.settings = {"b": False}
def run(self):
print("RUN")
class Top(Base):
def __init__(self):
super().__init__()
self.settings['a'] = True
def go(self):
print(self.settings)
x = Top()
x.go()
x.run()
在Base
中初始化settings
,而不是Top
。
class Base:
def __init__(self):
self.settings = {}
self.settings["b"] = False
def run(self):
print("RUN")
class Top(Base):
def __init__(self):
Base.__init__(self)
self.settings["a"] = True
def go(self):
print(self.settings)
子类应该依赖于它们的父类,反之亦然。 如果Base
没有初始化self.settings
,那么它依赖于其他一些尚未定义的类来初始化它(这是一个不好的依赖/假设引入)。
我会传入**kwargs
,因此很容易保持插入顺序与您的相同:
class Base:
def __init__(self, **kwargs):
self.settings = {**kwargs, 'b': False}
def run(self):
print("RUN")
class Top(Base):
def __init__(self):
super().__init__(a=True)
def go(self):
print(self.settings)
x = Top()
x.go()
x.run()
输出:
{'a': True, 'b': False}
RUN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.