Подтвердить что ты не робот

Python: можно вызвать статический метод из класса без указания имени

Это раздражает:

class MyClass:
    @staticmethod
    def foo():
        print "hi"

    @staticmethod
    def bar():
        MyClass.foo()

Есть ли способ сделать эту работу без вызова MyClass в вызове? т.е. я могу просто сказать foo() в последней строке?

4b9b3361

Ответ 1

Невозможно использовать foo и получить то, что вы хотите. Нет неявной области видимости класса, поэтому foo является локальным или глобальным, ни один из которых вам не нужен.

Вы могли бы найти классные методы более полезными:

class MyClass:
    @classmethod
    def foo(cls):
        print "hi"

    @classmethod
    def bar(cls):
        cls.foo()

Таким образом, по крайней мере, вам не нужно повторять имя класса.

Ответ 2

Невозможно. Речь идет о языковом дизайне. Сравните это с С++, где оба this (то же, что и Python self; в Python вам нужно написать self.var, в С++ вы можете написать только var, а не this->var), а собственный класс используется default в функциях-членах, и вы, вероятно, увидите, что иногда это хорошо, а иногда и раздражает. Единственное, что возможно, - это привыкнуть к этой функции.

Ответ 3

Вы можете сделать что-то взломанное, выполнив функцию уровня модуля foo, а затем добавив ее в пространство имен классов с помощью staticmethod:

def foo():
    print "hi"

class MyClass(object):
    foo = staticmethod(foo)

    @classmethod
    def bar(cls):
        return cls.foo()

    def baz(self):
        return foo()


c = MyClass()
c.bar()
c.baz()

MyClass.bar()
MyClass.foo()