Класс игнорирует значения, назначенные в __init__ при создании экземпляра

Я пытаюсь создать с помощью Discord.Py несколько кнопок, на которых меняются метки. Я создал discord.ui.View, а внутри него есть __init__, который принимает значения name и id. Когда я вызываю class и добавляю точку останова, я вижу, что значения присвоены self.modelName и self.modelId, однако сгенерированная кнопка полностью игнорирует эти значения и использует значения по умолчанию.

Мой класс определяется следующим образом:

class AlphaStrikeCardButtons(discord.ui.View):
    modelName = "supernova 2"
    modelId = "3133"

    #defining constructor  
    def __init__(self,name,id):  
        super().__init__()
        self.modelName = name
        self.modelId = f'asc{id}'
        
    @discord.ui.button(label=modelName, custom_id=modelId, style=discord.ButtonStyle.blurple)
    #@discord.ui.button(label='supernova 5', custom_id='asc8132', style=discord.ButtonStyle.blurple)
    async def alphaStrikeCard(self, interaction: discord.Interaction, button: discord.ui.Button):
        cardPath = f'./tmp/asc{modelId}.png' #If it already exists, we don't need to download it again
        if os.path.isfile(cardPath) == False:
            cardUrl = f'http://masterunitlist.info/Unit/Card/{self.modelId}'
            print(cardUrl)
            urlretrieve(cardUrl,cardPath)
        cardFile = discord.File(cardPath,filename=f'{self.modelId}.png')
        await interaction.response.send_message(file=cardFile, ephemeral=False)
        self.stop()

Затем я вызываю класс, используя:

ASCB = AlphaStrikeCardButtons(name=modelName,id=modelId)
await interaction.response.send_message("Please click the button:",ephemeral=True,view=ASCB)

Значения modelName и modelId'Supernova 5' и '8132', однако на кнопке отображается «Сверхновая 2» и отображается custom_id из asc3133, что является значением по умолчанию. Я подтвердил, что значения назначены, добавив точку останова и наведя курсор на переменную:

Вы можете ясно видеть, что self.modelName имеет значение Supernova 5; так что это было правильно назначено.

Если я не присваиваю значения (назначаю None) modelName и modelId в начале, то при вызове класса я получаю еще более запутанную ошибку:

В data.comComponents.0.comComponents.0.label: это поле является обязательным.

Итак, он говорит, что я даже не передаю значение, но я наверняка это делаю.

Почему Python игнорирует значения, установленные для переменных modelName и modelId, когда я подтвердил, что значения присваиваются, и как мне гарантировать, что Python использует переданные значения?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это переменные класса:

class AlphaStrikeCardButtons(discord.ui.View):
    modelName = "supernova 2"
    modelId = "3133"

и это переменные экземпляра:

class AlphaStrikeCardButtons(discord.ui.View):
    def __init__(self, name, id):
        self.modelName = name
        self.modelId = f'asc{id}'

Вы определяете переменные экземпляра и класса с одним и тем же именем, что, похоже, не входит в ваши намерения.

Аргументы, которые вы предоставляете (label=modelName, custom_id=modelId) декоратору кнопки (@discord.ui.button), относятся к переменным класса, которые объясняют поведение и почему вы получаете ошибку, если вы их удалите.

Обратите внимание, что вы не можете просто поставить self. перед этими аргументами. Поскольку декоратор — это просто синтаксический сахар вокруг функции, вы не можете ссылаться на self в переданных ему аргументах, поскольку объект, на который ссылается self, не существует во время определения функции.

Я не знаком с библиотекой discordpy, но похоже, что вы можете использовать конструктор Button, чтобы инициализировать ее нужными значениями, а затем прикрепить ее к своему компоненту, вместо того, чтобы использовать декоратор - документация

Редактировать: этот плакат, похоже, пытался сделать что-то подобное; посмотри комментарии к ответу

Хорошо, это объясняет, почему, однако вы говорите, что я также не могу использовать self., так как мне передать эти значения?

Mogo 10.06.2024 21:40

Хорошо, в конечном итоге это привело к проблеме XY; хотя это направило меня в правильном направлении. Я мог бы потратить время на публикацию вопроса, на который я ответил сам (для X), если не найду там дубликата вопроса.

Mogo 10.06.2024 22:38

Я не знаком с этой библиотекой, поэтому я ссылаюсь только на документацию... вместо использования декоратора @discord.ui.button создайте экземпляр кнопки с помощью my_button = discord.ui.Button(label=modelName, custom_id=modelId), а затем прикрепите его к своему компоненту.

ryyyn 10.06.2024 22:40

@Mogo блестящая ссылка! :) Могу поспорить, что есть несколько способов добиться того, чего вы хотите.

ryyyn 10.06.2024 22:46

«Вы не должны иметь переменные экземпляра и класса с одинаковым именем», вы можете, если понимаете, что это значит, и это то, что вы хотите.

juanpa.arrivillaga 10.06.2024 22:53

@juanpa.arrivillaga спасибо за указание на это, я скорректировал формулировку, чтобы не вводить в заблуждение будущих посетителей.

ryyyn 10.06.2024 22:59

Другие вопросы по теме

Похожие вопросы

Замените отсутствующие строки в фрейме данных A вместе с соответствующими значениями данными из кадра данных B
Найдите первый рабочий день и последний рабочий день предыдущего месяца по дате
Сбор данных из профилей округов data.census.gov
Information_schema НЕВЕРНЫЙ ИДЕНТИФИКАТОР из снежинки при попытке доступа к истории запросов через скрипт Python
Как извлечь N элементов из каждого M элемента массива?
Раскрывающийся список ttk.Combobox остается видимым после того, как новое окно становится активным
FastAPI запускает команды конфигурации перед обслуживанием приложения?
Команда модальной формы Discord.py не дает ответа, несмотря на отсутствие ошибок в консоли
Пожалуйста, помогите решить это
Ошибка в службе когнитивного поиска Azure при сохранении страницы документа, связанной с каждым фрагментом, извлеченным из PDF-файла, в пользовательском WebApiSkill