Что такое Python-эквивалент метода класса Ruby? - PullRequest
9 голосов
/ 06 ноября 2010

В ruby ​​вы можете сделать это:

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()

Ответы [ 3 ]

18 голосов
/ 06 ноября 2010

Что вам нужно, так это декоратор 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()).

10 голосов
/ 06 ноября 2010

Есть два способа сделать это:

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


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

Разница в том, что статический метод вообще не имеет неявных параметров. Метод класса получает класс, к которому он вызывается, точно так же, как обычный метод получает экземпляр.

Какой из них вы используете, зависит от того, хотите ли вы, чтобы метод имел доступ к классу или нет.

Любой может быть вызван без экземпляра.

0 голосов
/ 06 ноября 2010

Вы также можете получить доступ к объекту класса в статическом методе, используя __class__:

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

По крайней мере, это работает в Python 3.1

...