Когда я выполняю свой проект discord.py, я обнаружил, что следующие коды работают хорошо в первый раз, но возвращают ошибку атрибута во второй раз (за один запуск).

class Test2(commands.Cog):
    def __init__(self, dc_bot):
        self.bot = dc_bot
        self.ui = ""

    @commands.command(description="get avatar")
    async def getavatar(self, ctx, *, content: str):
        avatar = self.bot.user.avatar_url

        self.ui += content
        await ctx.send(content)
        await ctx.send(avatar)

        self.__init__(self) # reset the values 

Первое время работает хорошо.
Во второй раз он скажет: AttributeError: "Test2" не имеет атрибута "user"
Думаю, потому что я хочу сбросить self.ui для следующего запуска.
И если в моей функции init есть много "self", которые мне нужно использовать, я подумал (раньше), что было бы неплохо просто вызвать функцию init. Но я думаю, что повторный запуск self.ui = dc_bot вызовет эту проблему. Не могли бы вы объяснить, почему это произошло?

1
TimG233 24 Окт 2021 в 23:49
Вы должны добавить в свой вопрос код, который использует этот класс. Это поможет нам понять, о чем вы говорите «в первый раз» и «во второй раз».
 – 
Nic3500
25 Окт 2021 в 00:38

2 ответа

Лучший ответ

Произошла ошибка при повторном вызове метода инициализации. self.__init__(self) на самом деле звонит Test2. __init__(self, self) . Что отменяет self.bot = self, таким образом, ошибку атрибута при повторном запуске команды. Вместо этого вы хотите:

self.__init__(self.bot)

Но это не очень хорошее решение, вместо этого у вас должен быть вспомогательный метод «сброса», который выполняет сброс, и вы вызываете вспомогательный метод вместо init. Поскольку обычно после того, как класс инициирован, вы не хотите снова вызывать метод init.

1
Taku 25 Окт 2021 в 02:33
Действительно полезно! Итак, не является ли «не вызывать функцию init снова» хорошей привычкой или обычными обычными вещами, которые поступили бы другие люди?
 – 
TimG233
25 Окт 2021 в 02:48

Вы делаете код слишком сложным, попробуйте это!

    @commands.command(description  = "get avatar")

    async def getavatar(self, ctx, *, avamember: discord.Member = None):
        userAvatarUrl = avamember.avatar_url
        await ctx.send(userAvatarUrl)
0
Derek 25 Окт 2021 в 00:20