Как получить атрибут только из текущего класса, а не из возможных родительских классов?

Как получить атрибут только из текущего класса, а не из возможных родительских классов? Если я использую getattr он пересекает иерархию классов, но я бы хотел получить None если атрибут не определен в текущем классе (даже если он определен в некотором родительском классе).

Это не 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, а не родительский и дочерний).

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

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