Задать вопрос
Nightmare1
@Nightmare1
Программист

Как получить конкретный атрибут приложенный в обьект?

Есть класс, в котором есть словарик команд группы, вопрос, как получить атрибут только у обьекта без наследования?

class Система:
    """Группа команд."""

    Команды = {}

    def __init__(self, *args, **kwargs):
        pass

    def пользовательИмеетДоступ(self, bot, event):
        return True

    def __init_subclass__(cls, *args, **kwargs):
        if not hasattr(cls, 'Команды'): return
        print(cls, *args, **kwargs)
        cls.Команды[cls.__name__] = cls
        print(cls.__name__,cls.Команды)

class Another(Система):
        pass

getattr(Another, 'Команды') #должно вернуть None
  • Вопрос задан
  • 254 просмотра
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 1
Maksim_64
@Maksim_64
ML Engineer
Твоя задача, однозначно решается по другому и вряд ли твой или мой код имеет хоть какой то практический смысл.

Когда ты наследуешься, то ты наследуешь в том числе атрибуты класса. То есть вот это условие у тебя не выполняется
if not hasattr(cls, 'Команды'): просто return смысла не имеет ты там должен делать что то с классом который наследовался от твоего. Дальше без комментариев, смысла в твоих действиях нет.

Вопрос стоит так, возможно ли запретить наследование по определенному атрибуту, для дочернего класса. Ответ нет нельзя. В целом в питоне можно обойти практически любые запреты.

class Система:
    """Группа команд."""

    Команды = {}

    def __init__(self, *args, **kwargs):
        pass

    def пользовательИмеетДоступ(self, bot, event):
        return True

    def __init_subclass__(cls, *args, **kwargs):
        super().__init_subclass__(**kwargs)
        if any("Команды" in base.__dict__ for base in cls.__mro__[1:]) and "Команды" not in cls.__dict__:
            setattr(cls, "Команды", None)

class Another(Система):
    # Команды = {"Команда 1": 'тест'}
    pass

print(getattr(Another, 'Команды'))


Вот так мы получим следующее поведение, твоя строка будет возвращать None, как ты и хотел. Если же ты переопределишь, в дочернем классе, то команда вернет его значение.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽