5

私はこれができるようになりたいです:

class A(object):
    @staticandinstancemethod
    def B(self=None, x, y):
        print self is None and "static" or "instance"

A.B(1,2)
A().B(1,2)

これは簡単な解決策があるはずの問題のように思えますが、私はそれを考えることも見つけることもできません。

4

4 に答える 4

9

可能ですが、しないでください。私はそれを実装せずにはいられませんでした:

class staticandinstancemethod(object):
     def __init__(self, f):
          self.f = f

     def __get__(self, obj, klass=None):
          def newfunc(*args, **kw):
               return self.f(obj, *args, **kw)
          return newfunc

...そしてその使用:

>>> class A(object):
...     @staticandinstancemethod
...     def B(self, x, y):
...         print self is None and "static" or "instance"

>>> A.B(1,2)
static
>>> A().B(1,2)
instance

悪!

于 2011-04-28T02:17:19.980 に答える
0

とにかく静的メソッドのケースを使用して新しいクラスを作成したいので、それを通常のメソッドにして、__init__メソッドの最後で呼び出すのが最善です。

または、それが不要な場合は、クラスの外部に別のファクトリ関数を作成して、新しい空のオブジェクトをインスタンス化し、そのオブジェクトで目的のメソッドを呼び出します。

おそらくあなたが求めているものを正確に作成する方法はありますが、それらはPythonの内部メカニズムをさまよって、混乱し、python2.xと3.x間で互換性がありません-そして私はそれの本当の必要性を見ることができません。

于 2011-04-28T01:48:47.457 に答える
0

あなたが言っていることから、これはあなたが探しているものの線に沿っていますか?「ビルトイン」であるとあなたが言っていることを正確に行う方法があるかどうかはわかりません

class Foo(object):
    def __init__(self, a=None, b=None):
        self.a
        self.b

    def Foo(self):
        if self.a is None and self.b is None:
            form = CreationForm()
        else: 
            form = EditingForm()
        return form
于 2011-04-28T02:46:19.410 に答える
-3

あなたの質問への答えはノーです、あなたはそれをすることはできません。

Pythonは通常の関数もサポートしているので、私が行うことは、そのクラスの外部で関数を定義し、通常のメソッドからその関数を呼び出すことです。発信者は、どれが必要かを決定できます。

于 2011-04-28T01:48:01.437 に答える