でfun2Return
はそれを呼び出すラッパー関数を持っています。
def funcDec(func):
localVariable = "I'm a local string"
def wrapped(*args):
print("Calling localVariable from funcDec " + localVariable)
func(*args)
print("done with calling f1")
wrapped.attrib = localVariable
return wrapped
@funcDec
def f1(x, y):
print(x + y)
print('f1.attrib: {!r}'.format(f1.attrib))
f1(2, 3)
次の出力を生成します::
Calling localVariable from decorator I'm a local string
5
f1.attrib: "I'm a local string"
done with calling f1
を関数は、それらに割り当てられた任意の属性を持つことができますので、あなたは
は同様の効果を得るためにデコレータで、次のような何かを行うことができます
誰かがこれがクラスのメソッドに適用できるかどうか尋ねました: 答えは "はい"ですが、からまでのいずれかを参照する必要があります。クラス自体またはそのインスタンスがself
議論。両方の手法を以下に示します。 self
を使用すると、コードがそのクラスの名前とは無関係になるため、これが望ましいです。
class Test(object):
@funcDec
def f1(self):
print('{}.f1() called'.format(self.__class__.__name__))
print('self.f1.attrib: {!r}'.format(self.f1.attrib)) # Preferred.
print('Test.f1.attrib: {!r}'.format(Test.f1.attrib)) # Also works.
print()
test = Test()
test.f1()
出力:
Calling localVariable from funcDec I'm a local string
Test.f1() called
self.f1.attrib: "I'm a local string"
Test.f1.attrib: "I'm a local string"
done with calling f1
も参照してください:http://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scoping_and_dynamic_scoping – georg