Как получить атрибут только из текущего класса, а не из возможных родительских классов?
Как получить атрибут только из текущего класса, а не из возможных родительских классов? Если я использую getattr
он пересекает иерархию классов, но я бы хотел получить None
если атрибут не определен в текущем классе (даже если он определен в некотором родительском классе).
- Многопроцессорные объекты с namedtuple – Ошибка травления
- Python: объект 'int' не подлежит расшифровке
- Когда я передам экземпляр класса методу как самому себе?
- Как получить доступ к имени данной переменной в python?
- Создать объект из нескольких списков
Это не 100% -ный ответ (например, он не будет работать для классов, которые используют __slots__
), но он будет работать в большинстве случаев:
>>> class A(object): ... x = 42 ... y = 43 ... >>> class B(A): ... x = 11 ... >>> b = B()
Вы можете проверить, определен ли атрибут в классе следующим образом:
>>> 'x' in b.__class__.__dict__ True >>> 'y' in b.__class__.__dict__ False
Теперь, чтобы ответить на ваш вопрос:
# comment explaining why this unusual check is necessary if 'attribute' in instance.__class__.__dict__: value = instance.attribute else: value = None
Вы как бы нарисовали себя в угол своими правилами. Звучит скорее как недостаток дизайна, чем проблема с языком или классом с Python, поскольку beuth of python – удалить и скрыть сложность наследования класса.
Вам, скорее всего, придется согласиться на «альтернативное» решение, подобное этому:
class Parent(object): property_on_parent = 'default value' @property def property_accessor(self): return self.property_on_parent class Child(Parent): property_on_child = None @property def property_accessor(self): return self.property_on_child c = Child() assert c.property_accessor == None
Тем не менее, я чувствую, что вам лучше пересмотреть подход.
Ничто не мешает вам «перезагрузить», которые приписываются в init, устанавливая значение «Нет» после запуска супер (в классах Python, унаследованных и наследуемых, есть супер и sub btw, а не родительский и дочерний).
Если этот атрибут не создается в другом месте, и его присутствие не гарантируется, только в этом случае происходит переход к дереву наследования, после чего у вас могут возникнуть серьезные проблемы с дизайном 🙂
Все, что сказал, это проблемы с бедными людьми, и я согласен, что у вас могут возникнуть проблемы с дизайном.
- Рекомендации по работе с модулями Предпосылки
- Где лучше всего связать «текст отображения формы» с отображаемым свойством SQLAlchemy?
- python: изменение словаря, возвращаемого groupdict ()
- Python перестает обнюхивать определенное состояние
- В чем разница между объектами и классами в Python
- python: отслеживание изменений в классе, чтобы сохранить его в конце
- Метод Python по умолчанию / без имени
- Можно ли загрузить объект в память на FTP с помощью Python?
- Как распечатать информацию о пригодном для печати объекте в python
- Python: анализ XML-документа при сохранении сущностей
- ключ словаря python Vs атрибут объекта