Python: имеется в виду «я» между двумя классами - PullRequest
0 голосов
/ 05 апреля 2020

Я работаю над созданием игры в стиле Цивилизации, и как часть этого, я пытаюсь реализовать правительственный механизм c.

Класс 'Handler' обрабатывает (среди прочего) интерфейс. Когда я нажимаю на кнопку «правительство», появляется куча кнопок, которые должны позволить мне выбрать предпочитаемое правительство.

Функция «drawInterface (self)», часть «класса Controller ()», делает много вещи, среди которых создание кнопки, которая создает правительственное меню. Это не относится к этому вопросу, на мой взгляд, но я включил его сюда для полноты "ради:

class Controller():
    def drawInterface(self):
        Controller.buttons.add(Button('Government', colourinactive=eval(Civilisationdb.get(Civilisationdb.active == 1).colour1), colourhover=eval(Civilisationdb.get(Civilisationdb.active == 1).colour1), colouractive=eval(Civilisationdb.get(Civilisationdb.active == 1).colour1), colouroutline=eval(Civilisationdb.get(Civilisationdb.active == 1).colour2), rect=pygame.Rect(384, 64, 256, 32), callback=self.toGovernment, text='Government', textcolour=eval(Civilisationdb.get(Civilisationdb.active == 1).colour2)))

При нажатии на эту кнопку, функция 'toGo Government (self)', часть ' class Controller () ', создает десятки кнопок, которые позволяют вам выбирать предпочитаемое правительство - в этом примере я включил только одну кнопку:

class Controller():
    def toGovernment(self):
        if Controller.interfacemenu != 'Government':
            Controller.interfacemenustructure.add(Button('Hegemony', colourinactive=eval(Civilisationdb.get(Civilisationdb.active == 1).colour1), colourhover=eval(Civilisationdb.get(Civilisationdb.active == 1).colour1), colouractive=eval(Civilisationdb.get(Civilisationdb.active == 1).colour1), colouroutline=eval(Civilisationdb.get(Civilisationdb.active == 1).colour2), rect=pygame.Rect(64, 160, 160, 32), callback=lambda:Civilisation.selectGovernment('Structure','Hegemony'), text='Hegemony', fontsize=12, textcolour=eval(Civilisationdb.get(Civilisationdb.active == 1).colour2), toggleactive=True))

И поэтому есть еще много кнопок, которые вы можете увидеть в на снимке экрана ниже (приведенный выше код создает кнопку «Гегемония» в категории «Структура»): enter image description here Затем мы переходим к «Классу Цивилизации ()» для функции «Выбрать правительство» (тип, имя) :

    def selectGovernment(type, name):
        if type == 'Structure':
            self.structurecivic = name
        elif type == 'Government':
            self.governmentcivic = name
        elif type == 'Economy':
            self.economycivic = name
        elif type == 'Foreign':
            self.foreigncivic = name
        elif type == 'Military':
            self.militarycivic = name
        elif type == 'Religion':
            self.religioncivic = name
        changeGovernment(self.structurecivic, self.governmentcivic, self.economycivic, self.foreigncivic, self.militarycivic) #self.religioncivic

Здесь Python выдает ошибку, что 'self' не определено. Прямо над этой функцией я объявляю следующее как часть класса init:

        self.civilisationid = Civilisationdb.select(Civilisationdb.civilisationid).where(Civilisationdb.civilisation == self.civilisation, Civilisationdb.leader == self.leader)
        self.structurecivic = Civilisationdb.select(Civilisationdb.structurecivic).where(Civilisationdb.civilisationid == self.civilisationid)
        self.governmentcivic = Civilisationdb.select(Civilisationdb.governmentcivic).where(Civilisationdb.civilisationid == self.civilisationid)
        self.economycivic = Civilisationdb.select(Civilisationdb.economycivic).where(Civilisationdb.civilisationid == self.civilisationid)
        self.foreigncivic = Civilisationdb.select(Civilisationdb.foreigncivic).where(Civilisationdb.civilisationid == self.civilisationid)
        self.militarycivic = Civilisationdb.select(Civilisationdb.militarycivic).where(Civilisationdb.civilisationid == self.civilisationid)
        #self.religioncivic = Civilisationdb.select(Civilisationdb.religioncivic).where(Civilisationdb.civilisationid == self.civilisationid)

Предположительно, Python интерпретирует 'self' как ссылку на 'class Controller ()', а не на 'class Цивилизация ()». Я поиграл с различными способами написания этих функций, но безрезультатно. Как бы я это исправить? Что я недопонимаю?

Заранее большое спасибо! :)

...