6

私はここで愚かに見えるかもしれません。しかし、私はいくつかの python コードを書いていて、これは私を驚かせました。@Python には、次のような「周りの」関数で示され、使用されるデコレータと呼ばれるものがあります。

class PlotABC(metaclass=ABCMeta):

  @property
  def figure(self):
    if self._figure is None: self.__create_figure()
    return self._figure

  @abstractmethod
  def _prepare_series(self):
    pass

また、デザイン パターンの断片も知っており、デコレータと呼ばれるパターンがあることも知っています。そしたら「名前が似ているのは偶然じゃないかも」と思ったことがあります。

私はウィキを読みました:Decorator patternと素晴らしい答えHow to make a chain of function decorators? (ほぼ全体)。

Python のデコレーター セマンティクスは非常に強力で、デザイン パターンの実装に役立つように思えます。関数とメソッドをラップできるようにします。とはいえ、私はデザインパターンに慣れていないので、まだ混乱しています。また、このような専用のメカニズムを備えた言語も知りません。

デコレータパターンを作成するためにPythonセマンティクスが意図的に作成された場合、Pythonとデザインパターンの経験がある人は言うことができますか? それはもっと多いですか、それとも少ないですか、それとも別の意味ですか?

そして、メソッドの抽象化またはプロパティの宣言がそれをどのように装飾しているのか、いくつかの光を当ててみませんか?

4

2 に答える 2

9

いいえ、それは奇妙な偶然ではなく、いいえ、python @decorators は GOF Decorator パターンを実装していません。

GOF (Gang of Four、本「デザイン パターン」の 4 人の著者にちなんで名付けられた) デコレーター パターンは、オブジェクトの動作を変更する「装飾」を追加します。これは、装飾されていない基本クラスに適用できる「デコレータ」クラスを作成することによって行われます。

Python デコレーターは、関数またはクラスに「装飾」を追加します。これらのデコレーターは基本的に、関数/クラスをラップまたは変更する関数です。

デコレータを再利用して同じ機能を何度か追加できるという点ではどちらも似ていますが、デコレータ パターンでは、デコレータを一緒に、デコレートできるクラスのために設計する必要があります。

代わりに、Python デコレーターは関数の任意のクラスで作業を行います。

于 2013-07-29T14:57:14.847 に答える
5

「パターン」は、欠落している言語機能の回避策です。「装飾」はプログラミングのギャング・オブ・フォー・パターンの本に以前からあった用語で、何らかの情報や動作を別のものに追加することを含む任意の数の操作を表すために使用されてきました。

厳密に言えば、これはデコレーター パターンを実装する方法ではありません。他のクラスを構成するクラスの作成を必要としないためです (偶然にも、デコレーターでできることの 1 つを除いて)。ただし、Python の他の機能と合わせて使用​​すると、ほとんどが時代遅れになります。

実際、ほとんどの「パターン」は、C++ や Java などで動的またはリフレクション動作を偽装する方法であると付け加えておきます。これらの言語コミュニティの外では、興奮することはほとんどありません。Python のデコレータとメタクラスでは、あらゆる種類の変換をエンコードする方法が提供されます。Python では、単純なコードではないパターンの大部分が特定のデコレータまたはメタクラスに実質的に置き換えられると思います。

于 2013-07-29T14:56:01.573 に答える