2017-07-26 6 views
0

私は現在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風のスタイルです。誰もそれを行う方法を知っていますか?

おかげ

+0

私はこれをデコレートと呼んでいません。インスタンスベースでこれを行うのであれば、関数を直接呼び出すことができるので、これは機能的なクロージャであり、ほとんど不要です。インスタンスではなくクラスでデコレートされたメソッドを作成してみませんか? – AChampion

+0

"インスタンスではなくクラスで装飾されたメソッドを作成してみませんか?"理由はありません。これは作業プロジェクトではありません。私はPythonを勉強して、提供する機会を模索しています:) –

答えて

0

あなたはこの

for f in (deco(p.hello) for p in people): 
    f() 

またはこの

for p in people: 
    decorated = dec(p.hello) 
    decorated() 

ような何かをしたいが、私見、1最もニシキヘビあるかもしれません:あなたの最初の試みを#like ...

for f in map(deco, people): 
    f() 
+0

私はあなたの最初の解決策が本当に好きです。どうもありがとう。 –

関連する問題