[英]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.