簡體   English   中英

Python 類繼承和共享變量

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM