вызовы класса Python требуют, чтобы я отправил себя, SpeechEngine.test_choice (SpeechEngine) - PullRequest
0 голосов
/ 01 декабря 2018

У меня возникают некоторые проблемы, когда всякий раз, когда я выполняю вызов одного из моих методов классов, мне требуется специально отправлять содержащий класс вместе с вызовом, где я ожидаю, что он уже знает об этом сам.Я уверен, что это ошибка пользователя, но не могу отследить ее.

Я ссылался на python - самообязательный позиционный аргумент но я думаю, что у меня есть это.

class SpeechEngine():

def __init__(self):
    self.conn = sqlite3.connect('../twbot.db')
    self.c = self.conn.cursor()

@staticmethod
def choose(choice):
    num_choices = len(choice)
    selection = random.randrange(0, num_choices)
    return selection

def initial_contact_msg(self, userId, screenName):
    hello = self.c.execute("SELECT text, id FROM speechConstructs WHERE type='salutation'").fetchall()
    tagline = self.c.execute("SELECT text, id FROM speechConstructs WHERE type='tagline'").fetchall()
    c1 = self.choose(hello)
    c2 = self.choose(tagline)
    msg_string = str(hello[c1][0]) + ' @' + screenName + ' ' + tagline[c2][0]
    # print(msg_string) # For Testing Only
    # print(hello[c1][1]) # For Testing Only
    return msg_string

И тогда я ожидал бы позвонить

SpeechEngine.initial_contact_msg(0, 'somename')

Но это возвращает следующее

missing 1 required positional argument: 'self'

Где, как будто я делаю это неявно

SpeechEngine.initial_contact_msg(SpeechEngine, 0, 'somename')

Возвращает ожидаемые результаты без вопросов.Я также должен отметить, что то же самое происходит, когда я назначил бы его следующим образом.

test = SpeechEngine
test.initial_contact_msg(0, 'somename')

1 Ответ

0 голосов
/ 01 декабря 2018

Поскольку initial_contact_msg - это метод, вам нужно вызывать его из экземпляра, а не типа.Ваша последняя попытка почти правильная.Чтобы создать его, вам нужно сделать следующее:

test = SpeechEngine()
test.initial_contact_msg(0, 'sometime')

"SpeechEngine" - это класс типа.Когда вы создаете новый экземпляр, вам нужно вызывать его как функцию.Это похоже на использование ключевого слова «new» в других языках.

Если у вас есть статический метод, его можно вызывать непосредственно из объекта Type:

SpeechEngine.choose()

. Подробнеев документации Python .

...