Python: вызывает ли метод 'непосредственно' создание экземпляра объекта? - PullRequest
9 голосов
/ 08 июля 2010

Я новичок в Python и во время модульного тестирования некоторых методов на моем объекте я заметил нечто «странное».

class Ape(object):
    def __init__(self):
        print 'ooook'

    def say(self, s):
        print s

def main():
    Ape().say('eeek')

if __name__ == '__main__':
    main()

Я написал этот маленький пример, чтобы проиллюстрировать, где я запутался. Если вы выполняете Ape (). Say ('eeek'), это фактически создает экземпляр объекта Ape и запускает метод init? Я думал, что не будет, но у меня были странные побочные эффекты, так что теперь я думаю, что это имеет?

Ответы [ 3 ]

13 голосов
/ 08 июля 2010

Если вы хотите вызвать метод напрямую, не создавая экземпляр, вы можете использовать декоратор staticmethod.Обратите внимание, что self при использовании статического метода отсутствует

class Ape(object):
    def __init__(self):
        print 'ooook'

    @staticmethod
    def say(s):
        print s

def main():
    Ape.say('eeek')

if __name__ == '__main__':
    main()

Сравните с методами класса, где класс является первым параметром вместо экземпляра

class Ape(object):
    def __init__(self):
        print 'ooook'

    @classmethod
    def say(cls, s):
        print "the class is:", cls
        print s

def main():
    Ape.say('eeek')

if __name__ == '__main__':
    main()
11 голосов
/ 08 июля 2010

Да, это так. Вот что делает Ape(): он создает новый объект Ape, и как часть этого процесса запускается метод __init__.

В вашем примере вы затем вызываете метод say этого объекта. Обратите внимание, что не было бы способа вызвать say, если бы у вас не было объекта Ape.

3 голосов
/ 08 июля 2010

Да.Ape () создает экземпляр объекта класса Ape, хотя, поскольку нет присваивания, с ним не ассоциируется метка.В этот момент вызывается его функция __init__.Затем вызывается функция say.

Для ясности:

Ape().say('eeek')

эквивалентно:

(Ape()).say('eeek')

Что более четко указывает на то, что происходит первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...