MrShandy
@MrShandy
Python

AttributeError: 'Guild' object has no attribute 'guild' или как пофиксить class в python?

Захотел использовать в своем боте класс, но он выдает ошибку:
AttributeError: 'Guild' object has no attribute 'guild'

Не совсем понимаю из за чего такое, вот код:
Код
import configparser
import discord
from discord.ext import commands

config = configparser.ConfigParser()
config.read("config.ini", encoding='utf-8')

bot = commands.Bot(command_prefix=config["Config"]["prefix"], intents=discord.Intents.all())
#удаление стандартной команды help 
bot.remove_command('help')

class NewYear:

    async def __init__(self, guild):
        self.guild = guild

    async def ny_start(self):
        #изменение названия сервера
        guild_name = self.guild.name
        try:
            await self.guild.guild.edit(name=f'{guild_name}')
        except:
            print('Нет прав для изменения названия сервера')
            await self.guild.owner.send('Эй, бот не имеет прав.\n Вы должны выдать права "Управлять каналами","Управлять никнеймами","Управлять сервером","Управлять сообщениями" и запустить команду .start')
            return
        members = self.guild.members
        #перебор участников и установка ника
        for member in members:
            raw_name = member.name
            name = raw_name.replace("","")
            await member.edit(name=f'{name}', reason='Новый год ')
        #назначение прав для канала
        overwrites = {
            self.guild.default_role: discord.PermissionOverwrite(connect=False),
            self.guild.owner: discord.PermissionOverwrite(connect=True)
        }
        await self.guild.create_voice_channel('Новый год ', overwrites=overwrites, position=0)
        return

    async def ny_reset(self):
        #то же самое, но в обратном направлении
        #изменение названия сервера
        guild_name = self.guild.name
        await self.guild.edit(name=guild_name.replace("",""))
        members = self.guild.members
        #перебор участников и сброс ника
        for member in members:
            name = member.name
            await member.edit(name=name.replace("",""), reason='Конец нового года')
        #удаление канала "Новый год "
        for voice in self.guild.voice_channels:
            if voice.name == 'Новый год ':
                await voice.delete()

@bot.event
async def on_ready():
    print("Запустился под", bot.user)
    #установка статуста(Играет в {игра})
    await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name=config["Config"]["activity"]))

@bot.event
async def on_guild_join(guild):
    await NewYear.ny_start(guild)


@bot.command(aliases=['помощь'])
async def help(ctx):
    await ctx.message.delete()
    embed=discord.Embed(title="christmas-tree-in-discord", url="https://github.com/Shandeika/christmas-tree-in-discord", description="При входе на сервер проходится по каждому пользователю и добавляет ему  перед ником и после. Украсит ваш сервер к новому году.")
    embed.set_author(name="Shandy", url="https://vk.com/shandeika", icon_url="https://images-ext-1.discordapp.net/external/Nifqk3jVLvmFBCoVz1hauEOemI9X2MJPAGByFf5xpBk/%3Fsize%3D512/https/cdn.discordapp.com/avatars/335464992079872000/9c00b41b1efbc4fd02dce40ff5469bc0.png")
    embed.set_image(url='https://media.discordapp.net/attachments/680742104187797606/789168605961912322/cristmas_tree_bot.png')
    embed.set_footer(text="Copyright © 2019–2020 Shandy developer agency All Rights Reserved. © 2020")
    await ctx.channel.send(embed=embed)

@bot.command(aliases=['старт'])
@commands.has_guild_permissions(administrator=True)
async def start(ctx):
    await ctx.message.delete()
    await ctx.channel.send('Запущен процесс "новогодизации" сервера, ожидайте, пожалуйста.\nЭтот процесс может длиться достаточно долго.')
    await NewYear.ny_start(ctx.guild)
    await ctx.channel.send('Успешно!')

@bot.command(aliases=['сброс'])
@commands.has_guild_permissions(administrator=True)
async def reset(ctx):
    await ctx.message.delete()
    await ctx.channel.send('Запущен процесс сброса изменений, ожидайте, пожалуйста.\nЭтот процесс может длиться достаточно долго.')
    await NewYear.ny_reset(ctx.guild)
    await ctx.channel.send('Успешно!')

bot.run(config["Config"]["token"])

Если вместо self.guild.edit писать self.edit все начинает работать, но VSCode показывает ошибку:
5fdcbc9e10c56188827248.png
Как быть?
  • Вопрос задан
  • 540 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
AttributeError: 'Guild' object has no attribute 'guild'

Класс вы создали, а его объекты - нет.
Для работы с классом, нужно сначала создать его объект
obj = NewYer('guild_name')

Затем уже можно обращаться к нему
print(obj.guild)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы