Задать вопрос
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
  • Вопрос задан
  • 242 просмотра
Подписаться 1 Простой 4 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Eduson
    Python-разработчик
    9 месяцев
    Далее
  • Skillbox
    Python-разработчик
    10 месяцев
    Далее
Решения вопроса 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, как ты и хотел. Если же ты переопределишь, в дочернем классе, то команда вернет его значение.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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