私は現在Pythonを研究しており、デコレータの仕組みを探求するためにこのコードを書いています。Python:オブジェクトのリストを飾る
オブジェクトのリストとそのメソッドのうちの1つをデコレートするために使用する関数があるとしますが、デコレーションを永久にしたくないとします。
これは、結果を達成するための一つの方法である:
Hello, my name is Harry
Hello, my name is Sally
Decoration:
-*-*-*-*-*-*-*-*-*-*-*-*-
Hello, my name is Harry
*-*-*-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*-*-*-
Hello, my name is Sally
*-*-*-*-*-*-*-*-*-*-*-*-*
所望の出力である:
class Human:
def __init__(self, name):
self.name = name
class Man(Human):
def hello(self):
print("Hello, my name is " + self.name)
def __call__(self):
self.hello()
class Woman(Human):
def hello(self):
print("Hello, my name is " + self.name)
def __call__(self):
self.hello()
def deco(func):
def wrap():
print("-*-*-*-*-*-*-*-*-*-*-*-*-")
func()
print("*-*-*-*-*-*-*-*-*-*-*-*-*")
return wrap
H = Man("Harry")
S = Woman("Sally")
print("\n")
H.hello()
S.hello()
print("\n\nDecoration:\n")
people = [H, S]
for f in list(map(deco, people)):
f()
print("\n")
これが出力されます。
それはクラスでコール定義を削除し、使用することができ得るための別の方法は、この:私は明示的に私はなりたい機能を渡しているので、私は、希望
functions = [H.hello, S.hello]
for f in list(map(deco, functions)):
f()
デコ()デコレータに装飾されています。
私はこの
people = [H, S]
for i in range(len(people)):
decoratedHello = deco(people[i].hello)
decoratedHello()
のようなものを探していますが、この1つはより多くの思考のC++スタイルのように見える、と私は達成するための方法を探していますので、私は、しかし満足していませんこれはもっとPython風のスタイルです。誰もそれを行う方法を知っていますか?
おかげ
私はこれをデコレートと呼んでいません。インスタンスベースでこれを行うのであれば、関数を直接呼び出すことができるので、これは機能的なクロージャであり、ほとんど不要です。インスタンスではなくクラスでデコレートされたメソッドを作成してみませんか? – AChampion
"インスタンスではなくクラスで装飾されたメソッドを作成してみませんか?"理由はありません。これは作業プロジェクトではありません。私はPythonを勉強して、提供する機会を模索しています:) –