Как я могу получить доступ к переменным суперкласса в подклассе в Python? - PullRequest
1 голос
/ 19 марта 2020

Я просто пытаюсь сослаться на унаследованный экран Tkinter в подклассе, но по какой-то причине я получаю эту ошибку:

AttributeError: 'SignUpScreen' object has no attribute '_SignUpScreen__window'

После того, как я пытаюсь выполнить:

self.__signupScreen = SignUpScreen()

И код класса:

from tkinter import *

class Screen:

    def __init__(self, screenTitle, size):
        self.__window = Tk()
        self.__window.title(screenTitle)
        self.__SIZE = size #W x H

    def close(self):
        #Save all data, then
        self.__window.destroy()

class SignUpScreen(Screen):

    def __init__(self):
        super().__init__("Sign Up", "700x400")

        self.__titlelbl = Label(self.__window, text="Sign Up Window", font=("Arial Bold", 22))

    def run(self):
        self.__titlelbl.grid(column=0, row=0)
        self.__window.mainloop()

В среде IDE утверждается, что ошибка возникает в следующей строке:

self.__titlelbl = Label(self.__window, text="Sign Up Window", font=("Arial Bold", 22))

Я не понимаю, в чем проблема. Кто-нибудь может определить проблему?

1 Ответ

2 голосов
/ 19 марта 2020

Это из-за искажения имени Python :

Поскольку существует действительный вариант использования для закрытых членов класса (а именно, чтобы избежать столкновения имен в именах с именами, определенными подклассами), существует ограниченная поддержка такого механизма, называемого искажение имени. Любой идентификатор формы __spam (по крайней мере два начальных подчеркивания, самое большее одно конечное подчеркивание) заменяется в текстовом виде на _classname__spam, где classname - это имя текущего класса с удаленными начальными подчеркиваниями. Это искажение выполняется без учета позиции syntacti c идентификатора, если оно происходит в пределах определения класса.

У вас есть два варианта:

  1. Либо измените self.__window на имя без двойного подчеркивания в начале

  2. Используйте его как self._Screen__window (не рекомендуется).

...