メソッドが子クラスの 'classmethod' であるが親クラスのメソッドではない、親クラスのメソッドを持つ子クラスを作成したいと思います。
基本的に、私は次のことを達成しようとしています。
class foo(Object):
def meth1(self, val):
self.value = val
class bar(foo):
meth1 = classmethod(foo.meth1)
メソッドが子クラスの 'classmethod' であるが親クラスのメソッドではない、親クラスのメソッドを持つ子クラスを作成したいと思います。
基本的に、私は次のことを達成しようとしています。
class foo(Object):
def meth1(self, val):
self.value = val
class bar(foo):
meth1 = classmethod(foo.meth1)
何を達成しようとしていますか?ライブPythonコードでそのような構造を見た場合、元のプログラマーを打ち負かすことを検討します。
また、あなたが望む正確な動作が何であるかは完全にはわかりませんが、 bar.meth1(42) を foo.meth1 が bar のクラスメソッドである (「self」がクラスである) と同等にしたいと仮定すると、あなたはこれを達成することができます:
def convert_to_classmethod(method):
return classmethod(method.im_func)
class bar(foo):
meth1 = convert_to_classmethod(foo.meth1)
classmethod(foo.meth1) の問題は、foo.meth1 がすでにメソッドに変換されており、最初のパラメーターに特別な意味があることです。これを元に戻し、基になる関数オブジェクトを調べて、「自己」の意味を再解釈する必要があります。
また、これは非常に奇妙なことであり、コードを読んでいる人を混乱させる可能性があることにも注意してください。おそらく、問題に対する別の解決策を考えたほうがよいでしょう。
提起された質問は、私には非常に奇妙に思えます。なぜ誰かがそれをしたいのかわかりません。Python の「クラスメソッド」とは何かを誤解している可能性があります (たとえば、Java の静的メソッドとは少し異なります)。
通常のメソッドは多かれ少なかれ、最初の引数 (通常は "self" と呼ばれる) としてクラスのインスタンスを取り、"." として呼び出される単なる関数です。
クラスメソッドは多かれ少なかれ、最初の引数 (多くの場合「cls」と呼ばれます) としてクラスを取り、「.」として呼び出すことができる単なる関数です。または「.」として。
これを念頭に置いて、上記のコードで、誰かが bar のインスタンスを作成し、それに対して meth1 を呼び出すとどうなるでしょうか?
bar1 = bar()
bar1.meth1("xyz")
meth1 のコードが呼び出されると、2 つの引数「self」と「val」が渡されます。「val」には「xyz」が渡されることを期待していると思いますが、「self」には何が渡されると思いますか? それは bar1 インスタンスであるべきですか (この場合、オーバーライドは必要ありませんでした)? それとも、クラス バーにする必要がありますか (このコードは何を行うでしょうか)。