10

これは学術的な問題であり、実用的な問題ではありません。私は Python の基礎を掘り下げようとしていますが、疑問に思います:必要に応じて、純粋な Python でstaticmethodおよびclassmethodデコレータを実装できますか?

おそらく、staticmethod元の関数への参照を保持し、最初の引数を省略して呼び出すことができますか?

おそらく、classmethod元の関数への参照を保持し、引数自体ではなく、最初の引数の型を渡して呼び出すことができますか? (クラスで直接呼び出された場合、どのように処理しますか?)

繰り返しますが、実際にプログラムに実装したいわけではありません。そこから言語がどのように機能するかを学びたいです。可能であれば、コードサンプルをいただければ幸いです。そうでない場合は、理論的にできない理由を説明していただければ幸いです。ありがとう!

編集:回答と記述子プロトコルへの参照をありがとう!Python の理解を深めるために、さらに 2 つの質問をしたいと思います。

  • これは、記述子プロトコルなしで、たとえばクラスに __ call __ 特殊メソッドを実装することによって実行できますか?

  • 記述子プロトコルは、Python 2.7 と Python 3.x で同じように機能しますか?

再度、感謝します!

4

2 に答える 2

12

ドキュメントに例があります:

class StaticMethod(object):
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, objtype=None):
        return self.f

と:

class ClassMethod(object):
    "Emulate PyClassMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        def newfunc(*args):
            return self.f(klass, *args)
        return newfunc
于 2012-08-01T22:57:36.767 に答える
1

JF Sebastian's answer はあなたの質問に直接答えるので、受け入れる必要がありますが、この質問をすることは、ここで読むことができる記述子プロトコルについて知りたいことを意味します。これは、これらおよびその他の重要な Python 内部 (および控えめに使用すると、独自のコードで役立ちます)。property、および通常の古いバインドされたメソッドは、記述子プロトコルを使用して記述された他のものです。

最初にそれについて読んだときはそれほど単純ではありませんが、クリックするでしょう.

于 2012-08-01T23:43:02.597 に答える