2010-04-28 1 views
-1
def a(): 
    print 'sss' 

print getattr(a, "_decorated_function", a).__name__ 

это печать:, что этот код означает в питона,

a 

благодаря

обновленный

мой код:

def a(): 
    w='www' 

print getattr(a,'w') 

но печать:

Traceback (most recent call last): 
    File "D:\zjm_code\a.py", line 8, in <module> 
    print getattr(a,'w') 
AttributeError: 'function' object has no attribute 'w' 
+8

Вам необходимо начать чтение документов: http://docs.python.org/library/functions.html#getattr – SilentGhost

+1

Поскольку вы новичок, вы не будете использовать getattr() много, если вообще , – wescpy

+0

Пожалуйста, уточните название, чтобы более точно подойти к вопросу и, возможно, уточнить его. Какова ваша цель в вопросе, чтобы понять getattr или решить вашу проблему в обновленном разделе? – hultqvist

ответ

1

В ответ на Обновленный вопрос

функции должны быть даны их атрибуты после объявления.

def a(): 
    pass 

a.w = 'www' 
print a.w 

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

class a: 
    w = 'www' 

print a.w 

Это позволит ш делится между всеми экземплярами класса А, который является наиболее полезным в качестве константы в программе. Если вы на другой будет работать с переменной и изменить его значение, то это лучше сделать следующее:

class b: 
    def __init__(self): 
     self.w = 'www' 

c = b() 
print c.w 
+0

Кроме того, вы совершенно ошибаетесь, функции имеют атрибуты. Помните, все это объект в python? прочитайте первые строки http://diveintopython.org/getting_to_know_python/everything_is_an_object.html. – KillianDS

+0

@KillianDS извините за это, исправно! – hultqvist

+0

У KillianDS технические функции имеют атрибуты (например, __name__), но, очевидно, эти атрибуты не являются локальными переменными. Я думаю, вы можете получить локальные переменные через проверку или парсер, или что-то еще, но это не очень просто. – wisty

1

Если a имеет атрибут _decorated_function, то он возвращает то, что этот атрибут содержит, в противном случае она возвращает a. Серьезно, это все in the docs.

4

См. documentation for getattr in Python. Причина, по которой он печатает «a», заключается в том, что «a» не имеет атрибута с именем «_decorated_function», а третьим параметром getattr() является значение по умолчанию, возвращаемое в том случае, если первый параметр не имеет атрибута с именем второй параметр. Таким образом, ваш код так же, как:

 
print a.__name__ 

Не удивительно, имя является «а», следовательно, вы получите, что в качестве выхода. Кстати, я настоятельно рекомендую вам искать документацию Python до размещения здесь вопросов в StackOverflow, так как вы скорее получите ответы там раньше. Вы также можете найти мою поисковую машину Development and Coding Search, полезную при поиске соответствующей справочной документации Python для будущих запросов.

0

Возьму догадку:

Код может быть разбит на 2 этапа :

func = getattr(a, "_decorated_function", a) 
print func.__name__ 

Игнорировать первую строчку.

Вторая строка печатает имя func, которое в вашем случае является 'a'. Не удивительно.

Первая линия есть для случая декораторов:

class My_decorator: 
    def __init__(self,func): 
     self._decorated_function = func 
    def __call__(self,arg): 
     self._decorated_function(arg+1) 

@My_decorator 
def a(i): 
    print i 

print a(0) 
>>> 1 

print a._decorated_function.__name__ 
>>> a 

Так объектов, которые вы будете называть getattr(a, "_decorated_function", a), как ожидается, будут либо функция или классов, которые «декорированная» функция.

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