что этот код означает в Python, - PullRequest
0 голосов
/ 28 апреля 2010
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'

Ответы [ 4 ]

4 голосов
/ 28 апреля 2010

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

print a.__name__

Неудивительно, что имя a - это "a", поэтому вы получите его в качестве результата. Кстати, я настоятельно рекомендую вам поискать документацию по Python до публикации здесь вопросов в StackOverflow, поскольку вы, скорее всего, получите ответы там раньше. Вы также можете найти мой Разработка и поиск по кодированию пользовательский поисковый движок, полезный для поиска соответствующей справочной документации по Python для будущих запросов.

1 голос
/ 28 апреля 2010

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

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

def a():
    pass

a.w = 'www'
print a.w

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

class a:
    w = 'www'

print a.w

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

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

c = b()
print c.w
1 голос
/ 28 апреля 2010

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

0 голосов
/ 28 апреля 2010

Я приму предположение:

Код можно разбить на 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), должны быть либо функциями, либо классами, которые «украшали» функцию.

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