タグ付けされた質問 「decorator」

デコレーターは、オブジェクト指向の設計パターンであり、動的な方法で既存のクラスに動作を追加できます。ギャングオブフォーの構造設計パターンの1つです。

5
「デコレータ」とは何ですか?
AngularJSのデコレーターの正確なところを知りたいです。AngularJSのドキュメントの言い訳や、YouTubeビデオでの(興味深いものの)簡単な言及を除いて、デコレーターのためのオンラインの情報はあまりありません。 Angularの連中が言うように、デコレータは次のとおりです。 サービスの装飾。デコレータがサービスインスタンスの作成をインターセプトできるようにします。返されるインスタンスは、元のインスタンスか、元のインスタンスに委任された新しいインスタンスです。 それが何を意味するのか本当にわかりませんし、なぜこのロジックをサービス自体から切り離すのかわかりません。たとえば、異なる条件下で異なるものを返したい場合は、関連する関数に異なる引数を渡すか、そのプライベート状態を共有する別の関数を使用します。 私はまだAngularJSの初心者なので、私が気付いたのは単に無知や悪い習慣だと思います。

11
クラスのPythonデコレータ
次のようなものを書くことができます: class Test(object): def _decorator(self, foo): foo() @self._decorator def bar(self): pass これは失敗します:@self内のselfは不明です 私も試しました: @Test._decorator(self) これも失敗します:不明なテスト デコレータでいくつかのインスタンス変数を一時的に変更してから、それらを元に戻す前に装飾されたメソッドを実行したいと思います。
140 python  class  decorator  self 

8
プロキシパターンとデコレータパターンの違い
プロキシとデコレータの違いは何ですか? 私が目にする主な違いは、プロキシが構成を使用し、デコレータが集約を使用すると仮定すると、複数の(1つ以上の)デコレータを使用することで、既存のインスタンス(装飾)に機能を変更/追加できることは明らかです。プロキシには、プロキシされたクラスの独自の内部インスタンスがあり、それにいくつかの追加機能(プロキシの動作)を追加して委任します。 問題は、- 集約で作成されたプロキシはまだプロキシか、それともデコレータか?(GoFパターンの定義により)集約を使用してプロキシを作成することはできますか?

2
Facade、Proxy、Adapter、Decoratorのデザインパターンの違いは何ですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 この質問を改善する Facade、Proxy、Adapter、Decoratorのデザインパターンの違いは何ですか? 私は明確な説明を読んだことがありません、あなたは何ですか?

8
クラスを飾る方法は?
Python 2.5では、クラスを装飾するデコレータを作成する方法はありますか?具体的には、デコレーターを使用してクラスにメンバーを追加し、そのメンバーの値を取るようにコンストラクターを変更します。 次のようなものを探します( 'class Foo:'に構文エラーがあります: def getId(self): return self.__id class addID(original_class): def __init__(self, id, *args, **kws): self.__id = id self.getId = getId original_class.__init__(self, *args, **kws) @addID class Foo: def __init__(self, value1): self.value1 = value1 if __name__ == '__main__': foo1 = Foo(5,1) print foo1.value1, foo1.getId() foo2 = Foo(15,2) print foo2.value1, foo2.getId() …

7
Python標準ライブラリのデコレータ(特に@非推奨)
ルーチンに非推奨のマークを付ける必要がありますが、非推奨の標準ライブラリデコレータはありません。私はそれと警告モジュールのレシピを知っていますが、私の質問は次のとおりです:なぜこの(一般的な)タスクに標準のライブラリデコレータがないのですか? 追加の質問:標準ライブラリに標準デコレータはありますか?
127 python  decorator 

3
Python抽象クラスで抽象プロパティを作成する方法
次のコードでは、基本抽象クラスを作成しますBase。から継承するすべてのクラスにプロパティBaseを提供したいnameので、このプロパティをにしました@abstractmethod。 次にBase、と呼ばれるのサブクラスを作成しましたBase_1。にはnameプロパティはありませんがBase_1、Pythonはエラーなしでそのクラスのオブジェクトをインスタンス化します。どのようにして抽象プロパティを作成しますか? from abc import ABCMeta, abstractmethod class Base(object): __metaclass__ = ABCMeta def __init__(self, strDirConfig): self.strDirConfig = strDirConfig @abstractmethod def _doStuff(self, signals): pass @property @abstractmethod def name(self): #this property will be supplied by the inheriting classes #individually pass class Base_1(Base): __metaclass__ = ABCMeta # this class does not provide the …


6
装飾された関数の署名を保持する
非常に一般的なことを行うデコレータを書いたとしましょう。たとえば、すべての引数を特定の型に変換したり、ロギングを実行したり、メモ化を実装したりできます。 次に例を示します。 def args_as_ints(f): def g(*args, **kwargs): args = [int(x) for x in args] kwargs = dict((k, int(v)) for k, v in kwargs.items()) return f(*args, **kwargs) return g @args_as_ints def funny_function(x, y, z=3): """Computes x*y + 2*z""" return x*y + 2*z >>> funny_function("3", 4.0, z="5") 22 これまでのところすべてが順調です。ただし、問題が1つあります。装飾された関数は、元の関数のドキュメントを保持しません。 >>> help(funny_function) Help …
111 python  decorator 

8
Pythonのメモ化/遅延ルックアッププロパティデコレーター
最近、インスタンス属性がデータベースに保存された値を反映する多くのクラスを含む既存のコードベースを調べました。これらの属性の多くをリファクタリングして、データベースルックアップを延期しました。コンストラクタで初期化されるのではなく、最初の読み取り時にのみ初期化されます。これらの属性はインスタンスの存続期間を通じて変化しませんが、初回の計算では実際のボトルネックであり、特別な場合にのみ実際にアクセスされます。したがって、それらはデータベースから取得された後にキャッシュすることもできます(したがって、これは入力が単に「入力なし」であるメモの定義に適合します)。 さまざまなクラスのさまざまな属性について、次のコードスニペットを何度も入力していることに気づきました。 class testA(object): def __init__(self): self._a = None self._b = None @property def a(self): if self._a is None: # Calculate the attribute now self._a = 7 return self._a @property def b(self): #etc Pythonでこれを行うための既存のデコレータはありますか?または、これを行うデコレータを定義するための合理的に簡単な方法はありますか? 私はPython 2.5で作業していますが、2.6の回答が大幅に異なる場合は、それでも興味深いかもしれません。 注意 この質問は、Pythonがこのための既製のデコレータを多数含む前に行われました。用語を修正するためだけに更新しました。
109 python  decorator 

12
インスタンスメソッドのデコレータはクラスにアクセスできますか?
こんにちは、次のようなものがあります。基本的に、インスタンスメソッドの定義で使用されるデコレータからインスタンスメソッドのクラスにアクセスする必要があります。 def decorator(view): # do something that requires view's class print view.im_class return view class ModelA(object): @decorator def a_method(self): # do some stuff pass コードは現状のまま: AttributeError: 'function' object has no attribute 'im_class' 私は同様の質問/回答を見つけました-Pythonデコレーターは、関数がクラスに属していることを関数に忘れさせ、Pythonデコレーターのクラスを取得します -しかし、これらは実行時に最初のパラメーターをスナッチしてインスタンスを取得する回避策に依存しています。私の場合、クラスから収集した情報に基づいてメソッドを呼び出すので、呼び出しが来るのを待つことができません。
108 python  decorator 

5
Webpack Babel 6 ES6デコレーター
ES6でwebpackを私のバンドラーとして作成したプロジェクトがあります。ほとんどのトランスパイルは問題なく動作しますが、デコレータをどこかに含めようとすると、次のエラーが発生します。 Decorators are not supported yet in 6.x pending proposal update. 私はbabelの課題追跡を調べましたが、そこで何も見つけることができなかったので、間違って使用していると思います。私のwebpack設定(関連ビット): loaders: [ { loader: 'babel', exclude: /node_modules/, include: path.join(__dirname, 'src'), test: /\.jsx?$/, query: { plugins: ['transform-runtime'], presets: ['es2015', 'stage-0', 'react'] } } ] 私は他に何も問題はありません、矢印関数、すべての構造を正常に解体すること、これが機能しない唯一のものです。 私はいつでも以前に動作していたbabel 5.8にいつでもダウングレードできることを知っていますが、これを現在のバージョン(v6.2.0)で動作させる方法がある場合は役立ちます。

1
デコレーターの実行順序
def make_bold(fn): return lambda : "<b>" + fn() + "</b>" def make_italic(fn): return lambda : "<i>" + fn() + "</i>" @make_bold @make_italic def hello(): return "hello world" helloHTML = hello() 出力: "<b><i>hello world</i></b>" 私はデコレーターについて大まかに理解し、ほとんどの例でそれがどのように機能するかを理解しています。 この例では、2つあります。出力から、@make_italic最初に実行され、次にが実行されるようです@make_bold。 これは、装飾された関数の場合、最初に関数を実行してから、他のデコレーターの上部に移動することを意味しますか?同様に@make_italicまず@make_bold、代わりに反対の。 これは、ほとんどのプログラミング言語でのトップダウンアプローチの標準とは異なることを意味しますか?このデコレータの場合だけですか?それとも私は間違っていますか?

3
Pythonでルートロガーがデバッグレベルに設定されているかどうかを確認していますか?
次のようなコマンドラインパラメータを使用して、ロギングモジュールをデバッグに設定した場合: if (opt["log"] == "debug"): logging.basicConfig(level=logging.DEBUG) ロガーがDEBUGに設定されているかどうかを後で確認するにはどうすればよいですか?Trueフラグが渡された場合に関数の時間を計測するデコレータを作成しています。フラグが指定されていない場合、ルートロガーがDEBUGに設定されていると、デフォルトでタイミング情報が出力されます。

13
パラメータの有無にかかわらず使用できるPythonデコレータを作成するにはどうすればよいですか?
次のいずれかのパラメータで使用できるPythonデコレータを作成したいと思います。 @redirect_output("somewhere.log") def foo(): .... またはそれらなし(たとえば、デフォルトで出力をstderrにリダイレクトするため): @redirect_output def foo(): .... それは可能ですか? 出力のリダイレクトの問題に対する別の解決策を探しているわけではないことに注意してください。これは、実現したい構文の単なる例です。
88 python  decorator 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.