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

Я искал 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().

что ты уже испробовал? В чем именно была проблема?

mkrieger1 09.04.2019 20:20

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

Jean-François Fabre 09.04.2019 20:24

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

mkrieger1 09.04.2019 21:30

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

mkrieger1 09.04.2019 21:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
366
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужен какой-то способ указать, что 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__? Я считаю, что должен быть какой-то код, который должен обрабатывать этот пограничный случай.

dyao 09.04.2019 22:13

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

Devesh Kumar Singh 09.04.2019 22:26

Другие вопросы по теме