元。
私がこのようなものを持っている場合:
class C(object):
@classmethod
def f(cls, x):
return x + x
これはうまくいきます:
c = C()
c.f(2)
4
しかし、それは悪い形ですか?電話するだけでいいのか
C.f()
また
c.__class__.f()
明らかに、これは f がクラスであることを期待して self/cls と対話しない場合にのみ意味があります。
?
元。
私がこのようなものを持っている場合:
class C(object):
@classmethod
def f(cls, x):
return x + x
これはうまくいきます:
c = C()
c.f(2)
4
しかし、それは悪い形ですか?電話するだけでいいのか
C.f()
また
c.__class__.f()
明らかに、これは f がクラスであることを期待して self/cls と対話しない場合にのみ意味があります。
?
インスタンスからクラス メソッドを呼び出したい場合は、おそらくクラス メソッドは必要ありません。
あなたが与えた例では、あなたの最後の発言のために、静的メソッドがより適切です(self/clsの相互作用はありません)。
class C(object):
@staticmethod
def f(x):
return x + x
このように、両方を行うのは「良い形」です
c = C()
c.f(2)
と
C.f(2)
クラスの外からこのようなクラスメソッドを使用した覚えはありませんが、インスタンスメソッドがそれ自体でクラスメソッドを呼び出すことは確かに問題ありません (たとえばself.foo()、どこにクラスメソッドがありますかfoo)。これにより、継承が期待どおりに機能し.foo()、基本クラスではなく適切なサブクラスが呼び出されるようになります。
それは主に見た目が紛らわしいだけです。私があなたのクラスを使用していてこれを見たら、他にどんなサプライズがあるのだろうと思うでしょう。それは単に悪いデザインのように見えます.
単なる静的メソッドではない理由はありますか?
C.f()よりも明確でc_instance.f()、c_instance.__class__.f()醜いだけです。明快さと美しさは Python コミュニティで非常に愛されている特性であるため、私は Cf() が最良の方法であると言う傾向があります。
他の方法で呼び出したい特別な理由はありますか?
C のインスタンスが既にある場合、なぜ f() をクラス メソッドにする必要があるのでしょうか。フォームが悪いだけでなく、通常は必要ありません。ネット上の誰かは、「オブジェクト内のいくつかのインスタンス変数が使用されているという印象を与えるため、これは悪いことですが、そうではありません」と言っています。
ただし、 Python の学習の 484 ページでは、どちらの方法でもメソッドを呼び出すことができ、同じインスタンスを渡す限り、まったく同じになることが記載されています。