Python объектно-ориентированное программирование - PullRequest
2 голосов
/ 19 января 2011

Пытаюсь понять объектно-ориентированное программирование на python.Я новичок в программировании.У меня есть этот класс, который дает мне ошибку, которую я не понимаю, и я буду рад, если кто-нибудь сможет пролить больше света на это для меня:

class TimeIt(object):

    def __init__(self, name):
        self.name = name

    def test_one(self):
        print 'executed'

    def test_two(self, word):
        self.word = word
        i = getattr(self, 'test_one')
        for i in xrange(12):
            sleep(1)
            print 'hello, %s and %s:' % (self.word, self.name),
            i()

j = TimeIt('john')  
j.test_two('mike')

Если я запусту этот класс, я получу 'int' object is not callable" TypeError

Однако, если я предшествую i с self (self.i), это сработает.

class TimeIt(object):

    def __init__(self, name):
        self.name = name

    def test_one(self):
        print 'executed'

    def test_two(self, word):
        self.word = word
        self.i = getattr(self, 'test_one')
        for i in xrange(12):
            sleep(1)
            print 'hello, %s and %s:' % (self.word, self.name),
            self.i()

У меня вопрос, не i = getattr(self, 'test_one') присваивает test_oneфункция i?
Почему i() не работает?
Почему self.i() работает?
Почему i * int (отсюда 'int' object is not callable TypeError)?
Это много вопросов.Заранее спасибо

Ответы [ 2 ]

9 голосов
/ 19 января 2011

Вы перезаписываете i в цикле. Когда вы «предшествуете» i с помощью self, вы создаете другую переменную, которая не перезаписывается.

2 голосов
/ 19 января 2011

@ SilentGhost прямо на деньги с его ответом.

Для иллюстрации попробуйте изменить метод test_two следующим образом:

def test_two(self, word):
    self.word = word
    i = getattr(self, 'test_one')
    for some_other_variable_besides_i in xrange(12):
        sleep(1)
        print 'hello, %s and %s:' % (self.word, self.name),
        i()

Ваш код перезаписывает переменную i (установленную как метод) внутри цикла for (см. Комментарии)

def test_two(self, word):
    self.word = word
    i = getattr(self, 'test_one')
    # i is now pointing to the method self.test_one
    for i in xrange(12):
        # now i is an int based on it being the variable name chosen for the loop on xrange
        sleep(1)
        print 'hello, %s and %s:' % (self.word, self.name),
        i()

Кроме того, вам, конечно, не нужно присваивать метод test_one такой переменной, как i.Вместо этого вы можете просто вызвать метод, заменив

i()

на

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