Вы не можете, по определению. Декоратор:
@dec
def foo():
return 1
является просто ярлыком для:
def foo_internal()
return 1
foo = dec(foo_internal)
Обратите внимание, что декоратор dec
- это просто какое-то вызываемое, возвращающее что-то (функция, возможно, какой-то другой вызываемый объект). Вы даже не знаете, имеет ли foo
какое-либо отношение к декорированному определению, например:
def dec(f):
def not_foo():
return 0
return not_foo
. Если вам нужно добавить дополнительную информацию о методах, классах и т. Д., Например, например. атрибуты в .NET --- просто установите для них некоторые атрибуты.
def foo()
return 1
foo.decorated = True
Или реализуйте декораторы, которые устанавливают эти атрибуты, если это действительно помогает читать.
def dec(f):
f.decorated = True
return f
Что ж. Python является открытым исходным кодом. Вы всегда можете расширить интерпретатор Python для отслеживания декораторов, применяемых к объекту. Поскольку (как показано выше) объект, возвращенный декоратором, не должен быть каким-либо образом связан с украшенным объектом, эта реализация должна будет хранить информацию от украшенного объекта до применения декоратора, применять декоратор, заменять информацию декоратора на возвращенный объект и добавлять информацию о последнем декораторе.
Можно сделать. Но я не уверен, действительно ли это полезно. И это добавляет некоторые накладные расходы для каждого декоратора. Поэтому я не ожидал такого механизма в основном Python, если только он не предоставляет некоторые другие преимущества, такие как упрощение реализации декораторов и т. Д.
Как Иоганнес, на который указывают,
for c in "string":
#do something with c
, можно выполнить итерации в значительной степени чего-либо в Python с помощью эти for loop
конструкция,
, например, open("file.txt")
возвраты объект файла (и открывает файл), выполнение итерации по нему выполняет итерации по строкам в том файле
with open(filename) as f:
for line in f:
# do something with line
, Если это походит на волшебство, хорошо это отчасти, но идея позади него действительно проста.
существует простой протокол итератора, который может быть применен к любому виду объекта сделать for
работа цикла над ним.
Просто реализуют итератор, который определяет next()
метод, и реализуйте __iter__
метод на классе для создания его повторяемым. (__iter__
, конечно, должен возвратить объект итератора, то есть, объект, который определяет next()
)
Только для создания более всестороннего ответа способ C выполнить итерации по строке может применяться в Python, если Вы действительно хотите вызвать квадратный штепсель в круглую дыру.
i = 0
while i < len(str):
print str[i]
i += 1
, Но с другой стороны, почему делают это, когда строки по сути повторяемы?
for i in str:
print i