Как получить атрибут только из текущего класса, а не из возможных родительских классов? - PullRequest
3 голосов
/ 20 июля 2010

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

Ответы [ 3 ]

3 голосов
/ 20 июля 2010

Это не 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
0 голосов
/ 20 июля 2010

Ничто не мешает вам "сбросить" атрибут attrib в init, задав для него значение None после инициации super (в унаследованных и наследуемых классах Python super и sub btw, а не parent и child).этот атрибут создается в другом месте, и его присутствие не гарантируется, только в этом случае, когда вы поднимаетесь по дереву наследования, в этот момент у вас могут возникнуть серьезные проблемы с дизайном:)

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

0 голосов
/ 20 июля 2010

Вы как бы загнали себя в угол со своими правилами. Больше похоже на недостаток дизайна, чем на проблему языка или класса в Python, так как задача 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

Однако я чувствую, что вам лучше переосмыслить подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...