子クラスで継承されたメソッドをどのように装飾しますか?

ジョジョ

継承されたメソッドでデコレータを使用する方法がよくわかりません。通常、デコレータは定義の前に配置されますが、継承された関数の場合、定義は子クラスではなく親で指定されます。子クラスのメソッドの定義を書き直さずに、継承されたメソッドの周りにデコレータを配置するように指定したいと思います。

自分自身を明確にするために、これが私が意味することの実際的な例です:

class Person():
    def __init__(self, age):
        self.age = age

    @classmethod
    def gets_drink(cls, ):
        print "it's time to get a drink!"
        return "A beer"

def dec(some_f):
    def legal_issue(obj,):
        some_f(obj)
        return 'A Coke'
    return legal_issue

class Child(Person):
    def __init__(self, age):
        Person.__init__(self, age=age)

    #in principle i'd like to write
    #@dec
    #self.gets_drink
    #which does not work
    #the only working way I found is by defining the method as a classmethod
    #and write this:

    @dec
    def gets_drink(self, ):
        return Person.gets_drink()

dad = Person(42)
son = Child(12)

print dad.gets_drink()
print son.gets_drink()

この例で行われている方法は機能しますが、メソッドを元のメソッドの呼び出しに置き換えてデコレータを配置できるようにするだけで、私にはどういうわけか奇妙に見えます。また、これを機能させるには、メソッドを親クラスのclassmethodとして定義する必要があります。

私は何かが足りないのですか?経験豊富な開発者はこれをどのように行いますか?

どんな助け、洞察、批判的なコメントと無料のコーヒーも大歓迎です!

Martijn Pieters

デコレータ構文でデコレータを使用する必要はありませんそれはただの呼び出し可能です:

class Child(Person):
    def __init__(self, age):
        Person.__init__(self, age=age)

    gets_drink = dec(Person.gets_drink.__func__)

これにより、デコレータの戻り値が同じ名前のメソッドとして子クラスに追加されます。この__func__属性は、バインドされた(クラス)メソッドをアンラップし、元の関数を取得します。

新しいメソッドはクラスメソッドではなく通常のメソッドになっていることに注意してくださいclassmethod()。そのため呼び出しで結果を再ラップする必要があります。

これは、構文が機能するために機能します

@decorator_expression
def function_definition():
    pass

は単なる構文糖衣です:

def function_definition():
    pass
function_definition = decorator_expression(function_definition)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クラス内でデコレータを宣言して、すでに装飾された継承されたメソッドを装飾するにはどうすればよいですか?

分類Dev

C ++の継承されたクラスで通常のメソッドを静的メソッドに変更するにはどうすればよいですか?

分類Dev

Delphi OOPは、継承されたクラスからメソッドを再実装するように強制します

分類Dev

Rubyの継承された親メソッドでChildクラスを取得するにはどうすればよいですか?

分類Dev

unittestライブラリは、装飾されたメソッドを実行するかどうかをどのように決定しますか?

分類Dev

継承されたメソッドのタイプをどのように変更しますか?

分類Dev

親クラスが同じconstフィールドを持つ継承されたメソッドで、子クラスのconstフィールドを使用するにはどうすればよいですか?

分類Dev

EasyMockで抽象クラスから継承されたメソッドをモックするにはどうすればよいですか?

分類Dev

defaultdictを継承し、そのコピーメソッドをサブクラスメソッドで使用するにはどうすればよいですか?

分類Dev

Grails [Groovy]、継承されたメソッドなしでクラスが持つすべてのメソッドのリストを取得するにはどうすればよいですか?

分類Dev

Groovyで継承されたメソッドなしでクラスのすべてのメソッド名を取得するにはどうすればよいですか?

分類Dev

メソッド(複数のメソッド)をパラメーターとして継承されたvoidメソッドまたはC#のデリゲートに渡すにはどうすればよいですか?

分類Dev

@classmethodで装飾されたメソッドの__init __()で定義された属性にアクセスするにはどうすればよいですか?

分類Dev

継承クラスのメソッド実装を強制して、独自の埋め込みを呼び出す前にベースメソッドを呼び出すにはどうすればよいですか?

分類Dev

継承されたメソッドを親クラスに実装する

分類Dev

Python:スーパークラスから継承されたメソッドの下でサブクラスを「閉じる」ようにする方法

分類Dev

Abstract基本クラスから継承されたクラスにメソッドを追加しますか?

分類Dev

Pythonで継承されたクラスではなく、現在のクラスのインスタンスを返すようにメソッドを定義するにはどうすればよいですか?

分類Dev

Java子クラスはアクセス保護された親フィールドをどのように継承しますか?

分類Dev

サブクラスdocstringで「基本クラスに継承されたメソッド」を抑制します

分類Dev

基本クラスから継承されたクラスのメソッドを呼び出します。C ++

分類Dev

継承されたメソッドで子クラスを参照する方法は?

分類Dev

c#:継承された基本メソッドを呼び出すときの制御の流れ。継承された基本メソッドは、派生クラスで新規に設定された基本仮想メソッドを呼び出します。

分類Dev

Javaコンパイラーは継承されたメソッドをどのようにして知るのですか?

分類Dev

継承されたmixinメソッドをpyqtSlotとして装飾する

分類Dev

Odooの純粋なPythonクラスから継承してメソッドを変更するにはどうすればよいですか?

分類Dev

継承メソッドで使用されているクラスの関数を使用後にリセットまたは置換するにはどうすればよいですか?

分類Dev

継承されたクラスの変数が何かに等しいときにメソッドを実行するにはどうすればよいですか?

分類Dev

`@ property`で装飾されたすべてのメソッドのリストを取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    クラス内でデコレータを宣言して、すでに装飾された継承されたメソッドを装飾するにはどうすればよいですか?

  2. 2

    C ++の継承されたクラスで通常のメソッドを静的メソッドに変更するにはどうすればよいですか?

  3. 3

    Delphi OOPは、継承されたクラスからメソッドを再実装するように強制します

  4. 4

    Rubyの継承された親メソッドでChildクラスを取得するにはどうすればよいですか?

  5. 5

    unittestライブラリは、装飾されたメソッドを実行するかどうかをどのように決定しますか?

  6. 6

    継承されたメソッドのタイプをどのように変更しますか?

  7. 7

    親クラスが同じconstフィールドを持つ継承されたメソッドで、子クラスのconstフィールドを使用するにはどうすればよいですか?

  8. 8

    EasyMockで抽象クラスから継承されたメソッドをモックするにはどうすればよいですか?

  9. 9

    defaultdictを継承し、そのコピーメソッドをサブクラスメソッドで使用するにはどうすればよいですか?

  10. 10

    Grails [Groovy]、継承されたメソッドなしでクラスが持つすべてのメソッドのリストを取得するにはどうすればよいですか?

  11. 11

    Groovyで継承されたメソッドなしでクラスのすべてのメソッド名を取得するにはどうすればよいですか?

  12. 12

    メソッド(複数のメソッド)をパラメーターとして継承されたvoidメソッドまたはC#のデリゲートに渡すにはどうすればよいですか?

  13. 13

    @classmethodで装飾されたメソッドの__init __()で定義された属性にアクセスするにはどうすればよいですか?

  14. 14

    継承クラスのメソッド実装を強制して、独自の埋め込みを呼び出す前にベースメソッドを呼び出すにはどうすればよいですか?

  15. 15

    継承されたメソッドを親クラスに実装する

  16. 16

    Python:スーパークラスから継承されたメソッドの下でサブクラスを「閉じる」ようにする方法

  17. 17

    Abstract基本クラスから継承されたクラスにメソッドを追加しますか?

  18. 18

    Pythonで継承されたクラスではなく、現在のクラスのインスタンスを返すようにメソッドを定義するにはどうすればよいですか?

  19. 19

    Java子クラスはアクセス保護された親フィールドをどのように継承しますか?

  20. 20

    サブクラスdocstringで「基本クラスに継承されたメソッド」を抑制します

  21. 21

    基本クラスから継承されたクラスのメソッドを呼び出します。C ++

  22. 22

    継承されたメソッドで子クラスを参照する方法は?

  23. 23

    c#:継承された基本メソッドを呼び出すときの制御の流れ。継承された基本メソッドは、派生クラスで新規に設定された基本仮想メソッドを呼び出します。

  24. 24

    Javaコンパイラーは継承されたメソッドをどのようにして知るのですか?

  25. 25

    継承されたmixinメソッドをpyqtSlotとして装飾する

  26. 26

    Odooの純粋なPythonクラスから継承してメソッドを変更するにはどうすればよいですか?

  27. 27

    継承メソッドで使用されているクラスの関数を使用後にリセットまたは置換するにはどうすればよいですか?

  28. 28

    継承されたクラスの変数が何かに等しいときにメソッドを実行するにはどうすればよいですか?

  29. 29

    `@ property`で装飾されたすべてのメソッドのリストを取得するにはどうすればよいですか?

ホットタグ

アーカイブ