2014-03-20 2 views
3
class test(object): 
def __init__(self, a = 0): 
    test.a = a 

t = test() 

print test.a ## obviously we get 0 

''' ====== Question ====== ''' 

print test.somethingelse ## I want if attributes not exist, return None. How to do that? 
+0

http://docs.python.org/2/reference/datamodel.html#object.__getattr__, хотя мне интересно, почему вы хотите это сделать. Какова фактическая проблема, которую вы пытаетесь решить? –

ответ

9

Прежде всего, вы добавляете переменную в класс test.a = a. Вы должны добавить его в экземпляр, self.a = a. Потому что, когда вы добавляете значение в класс, все экземпляры будут обмениваться данными.

Вы можете использовать __getattr__ функцию как этот

class test(object): 
     def __init__(self, a = 0): 
      self.a = a 

     def __getattr__(self, item): 
      return None 

    t = test() 

    print t.a 
    print t.somethingelse 

Цитирования из __getattr__ документов,

Вызывается, когда поиск атрибута не найден атрибут в обычных местах (т.е. а не атрибут экземпляра, и он не найден в дереве классов для себя). name - это имя атрибута.

Примечание: Преимущество __getattr__ над __getattribute__ является то, что __getattribute__ будет называться всегда, мы должны обрабатывать вручную, даже если текущий объект имеет атрибут. Но, __getattr__ будет вызывать , но не, если атрибут найден в иерархии.

1

Вы ищете крючок __getattribute__. Нечто подобное должно делать то, что вы хотите:

class test(object): 
    def __init__(self, a = 0): 
     self.a = a 

    def __getattribute__(self, attr): 
     try: 
      return object.__getattribute__(self, attr) 
     except AttributeError: 
      return None 
+0

Вы имеете в виду '__getattr__'? –

+0

@FelixKling Нет. См. Раздел руководства, к которому я привязан. (Я понимаю, что обе работают, но '__getattribute__' является предпочтительным для нового кода.) – zwol

+0

' __getattribute__' может быть неэффективным, так как элемент управления достигает его всегда, даже если поиск элемента находится в иерархии. – thefourtheye

Смежные вопросы