2016-07-05 5 views
-9

私はPython OOPを勉強しています。私はデコレータのトピックに着きましたが、私が勉強するために使っている資料は、それを深くカバーしていません。 私はサンプルコードをポスト:デコレータがPythonで何をしているのか説明できますか?

class Duck: 
    def __init__(self, **kwargs): 
     self.properties = kwargs 

    def quack(self): 
     print("Quaaack!") 

    def walk(self): 
     print("Walk like a duck.") 

    def get_properties(self): 
     return self.properties 

    def get_property(self, key): 
     return self.properties.get(key, None) 

    @property 
    def color(self): 
     return self.properties.get("color", None) 

    @color.setter 
    def color(self, c): 
     self.properties["color"] = c 

    @color.deleter 
    def color(self): 
     del self.properties["color"] 

def main(): 
    donald = Duck() 
    donald.color = "blue" 
    print(donald.color) 

if __name__ == "__main__": main() 

は、あなたは私のデコレータの重要性を理解するのに役立つことはできますか? デコレータのコンセプトを簡単に説明できますか?

+1

インターネット上のデコレータに関する記事がたくさんあります。例えば。 http://thecodeship.com/patterns/guide-to-python-function-decorators/ –

+2

https://docs.python.org/3/glossary.html#term-decorator、https://docs.python.org /3/reference/compound_stmts.html#function –

+1

[Python - Decorators]の複製の可能性があります。(0120-339-501) – SiHa

答えて

1

「単に関数デコレータされている既存の関数にラッパー」

は、一般的にデコレータは

であると言われて、私は単純に上記のコードについて言うことができるものをいくつか書いてみましょう

デコレータは常に別の関数をラップします。デコレータ自体が関数であることは言うまでもありません。

aboあなたが設定している、取得している、プロパティ/正式に色である "アヒル"の属性を削除しています。

デコレータは常に '@'で始まります。 @propertyはあなたのゲッター、セッターを取るためのもの事前に定義されたデコレータ機能とクラスのデル関数である

@property #getter 
    def color(self): 
     return self.properties.get("color", None) 

    @color.setter #setter 
    def color(self, c): 
     self.properties["color"] = c 

    @color.deleter #del 
    def color(self): 
     del self.properties["color"] 

あなたは@propertyに引数として関数(ゲッター、セッター、デル)を通過されてやってきたすべての

あなたのメインを書かれている場合我々はまた、私たち自身デコレータを持つことができます

if __name__ == "__main__": main() 
    donald = Duck() //creating object 
    donald.color = "blue" //call the setter method, look its more intuitive!! (you don't using the donald.color("blue") syntax) 
    print(donald.color)//getter 

、私は非常にその様々な用途と利点

の推奨リンクを読んですることをお勧めいたしますように、それは次のようになります
関連する問題