Я искал stackoverflow и не нашел хорошего ответа на этот вопрос.
Если я создам класс:
class Test():
def foo(self):
pass
def bar(self):
if bar() is called before foo(), then throw exception
есть ли способ, когда кто-то создает экземпляр класса и случайно вызывает bar()
перед foo()
следующим образом:
a = Test()
a.bar()
Python выдаст исключение, говорящее пользователю сначала вызвать foo()
.
вы можете использовать флаг, чтобы проверить, был ли вызван foo... вы также можете поместить код foo
в __init__
, чтобы он вызывался, когда создание объект.
Или можно сделать так, чтобы вызов bar
перед foo
не был ошибкой.
Или вы можете заставить bar
требовать «ключ», который можно получить у foo
(как в видеоиграх, чтобы вы посещали места в правильном порядке).
Вам нужен какой-то способ указать, что 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()
Просто вызовите 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
Я вижу, что вы сделали, и это имеет смысл, но что, если пользователь снова явно вызовет foo()
, не осознавая, что он уже создан в методе __init__
? Я считаю, что должен быть какой-то код, который должен обрабатывать этот пограничный случай.
Код внутри foo можно изменить, чтобы он обрабатывал случай, когда он вызывается снова, он не делает ничего плохого.
что ты уже испробовал? В чем именно была проблема?