2012-08-01 5 views
8

これは学問的な質問です。実用的な質問よりも優れています。私はPythonの基礎を掘り下げようとしています。私が望むなら、純粋なPythonでstaticmethodclassmethodのデコレータを実装できますか?staticmethodとclassmethod decoratersを純粋なPythonで実装できますか?

staticmethodについては、元の関数への参照を保持し、最初の引数を省略してもよいでしょうか?

classmethodについては、元の関数への参照を保持し、引数そのものではなく最初の引数の型を渡すことができますか? (私はそれをクラスで直接呼び出すことはできますか?)

もう一度、私のプログラムで実際に実装したいのではありません。私はその言語がどのように機能するかを学びたい。可能であれば、私はコードサンプルを本当に感謝します。もしそうでなければ、理論的にはできない理由を説明していただきたいと思います。ありがとう!

編集:回答とディスクリプタプロトコルへの参照をありがとう!私たちのクラスで__コール__特別なメソッドを実装することで、例えば、記述プロトコルなし

  • はこれが行うことができる。さらにはPythonの私の理解を拡張するための手段として、私は2つのより多くの事をお聞きしたいのですが?

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

もう一度おねがいします!

答えて

10

the docsの例があります。

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 
+0

私はこの答えを受け入れるつもりです。それは私の元の質問に対する良い、完全な答えです。しかし、あなたが私の編集にも答えると、私はそれをたくさん感謝します!ありがとう! – Tom

1

あなたはそれが直接あなたの質問に答えることから、JFセバスチャンの答えを受け入れるが、この質問をすると、あなたが知りたい意味すべきですhereについて読むことができるディスクリプタプロトコルです。これは、これらおよび他の重要なPython内部構造を実装するために使用されるものです(そして、控えめに使用された場合は独自のコードで役立ちます)。 propertyであり、通常のバインドされたメソッドは、ディスクリプタプロトコルを使用して記述された他のものです。

最初に読んだときにそれを確認するのは簡単ではありませんが、クリックすると確認できます。

+0

リンクと説明をありがとう!私の編集を見てください。 – Tom

関連する問題