9

ルビーではこれを行うことができます:

class A
    def self.a
        'A.a'
    end
end

puts A.a #-> A.a

Pythonでこれをどのように行うことができますか。クラスのインスタンスで呼び出されることなく呼び出されるクラスのメソッドが必要です。これを実行しようとすると、次のエラーが発生します。

unbound method METHOD must be called with CLASS instance as first argument (got nothing instead)

これは私が試したものです:

class A
    def a():
       return 'A.a'

print A.a()
4

3 に答える 3

18

探しているのはstaticmethodデコレータです。これを使用して、最初の暗黙の引数を必要としないメソッドを作成できます。次のように使用できます。

class A(object):
    @staticmethod
    def a():
        return 'A.a'

一方、メソッドから(インスタンスではなく)クラスにアクセスする場合は、classmethodデコレータを使用できます。これは、ほとんど同じ方法で使用されます。

class A(object):
    @classmethod
    def a(cls):
        return '%s.a' % cls.__name__

これは、オブジェクトをインスタンス化せずに呼び出すことができます(A.a())。

于 2010-11-06T09:53:25.443 に答える
10

これを行うには2つの方法があります。

@staticmethod
def foo():     # No implicit parameter
    print 'foo'  


@classmethod
def foo(cls):   # Class as implicit paramter
    print cls

違いは、静的メソッドには暗黙のパラメーターがまったくないことです。クラスメソッドは、通常のメソッドがインスタンスを受け取るのとまったく同じ方法で、呼び出されるクラスを受け取ります。

どちらを使用するかは、メソッドがクラスにアクセスできるようにするかどうかによって異なります。

どちらもインスタンスなしで呼び出すことができます。

于 2010-11-06T09:53:05.317 に答える
0

次を使用して、静的メソッドでクラスオブジェクトにアクセスすることもできます__class__

class A() :
    @staticmethod
    def a() :
        return '{}.a'.format( __class__.__name__ )

少なくともこれはPython3.1で機能します

于 2010-11-06T12:37:04.460 に答える