Как получить атрибут объекта без учета наследования в Python

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

    Исходный код

    Имеется следующая структура классов:

    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

    Проблема

    При вызове getattr(Another, 'Команды') возвращается значение атрибута из родительского класса Система, а не None. Это происходит потому, что стандартная функция getattr() проверяет всю цепочку наследования.

    Решение

    Для получения атрибута только у конкретного класса (без учета родительских) можно использовать несколько подходов:

    • Проверка через __dict__:
      Another.__dict__.get('Команды', None)
    • Использование vars():
      vars(Another).get('Команды', None)
    • Метод hasattr с явной проверкой:
      value = Another.Команды if 'Команды' in Another.__dict__ else None

    Эти методы проверяют только собственные атрибуты класса Another, игнорируя унаследованные от Система.

    Примечание

    В представленном примере класс Another не переопределяет атрибут Команды, поэтому все указанные методы действительно вернут None. Если бы класс определял собственный атрибут Команды, методы вернули бы его значение.