Определение порядка вызова методов в классе Python

#python #python-3.x #python-2.7

#python #python-3.x #python-2.7

Вопрос:

Я искал stackoverflow и не смог найти хорошего ответа на этот вопрос.

Если я создам класс:

 class Test():
     def foo(self):
        pass

     def bar(self):
        if bar() is called before foo(), then throw exception
  

есть ли способ, чтобы, когда кто-то создает экземпляр class и случайно вызывает bar() before foo() подобным образом:

 a = Test()
a.bar()
  

Python выдаст исключение, сообщающее пользователю foo() о первом вызове.

Комментарии:

1. Что вы пробовали до сих пор? В чем именно заключалась проблема?

2. вы можете использовать флаг, чтобы проверить, был ли вызван foo … вы также можете поместить код foo in __init__ , чтобы он вызывался при создании объекта.

3. Или вы можете сделать так, чтобы вызов bar before foo не был ошибкой.

4. Или вы можете bar потребовать «ключ», который можно получить из foo (как это делают видеоигры, чтобы вы посещали места в правильном порядке).

Ответ №1:

Вам нужен какой-то способ указать, что foo() произошло при вызове bar() , может сработать что-то вроде следующего:

 class Test:
    def __init__(self):
        self.foo_called = False

    def foo(self):
        self.foo_called = True

    def bar(self):
        assert self.foo_called,"Error: foo() needs to be called first" # Or another error message
  

В идеале, ваш код будет обрабатывать это за вас. Если вам нужно вызвать только foo() один раз, тогда он может быть включен, в __init__ противном случае вы сможете вызвать его bar()

Ответ №2:

Просто вызывайте foo , когда вы создаете экземпляр объекта класса Test

 class Test():

    def __init__(self):
        self.foo()

    def foo(self):
        print('foo called')

    def bar(self):
        print('bar called')

t = Test()
t.bar()
foo called
bar called
  

Комментарии:

1. Я вижу, что вы сделали, и это имеет смысл, но что, если пользователь явно вызывает foo() снова, не осознавая, что он уже создан в __init__ методе? Я считаю, что должен быть какой-то код, который должен обрабатывать этот крайний случай

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