Python - Как сделать так, чтобы 2 объекта ссылались друг на друга? (Круговая зависимость) - PullRequest
1 голос
/ 26 апреля 2020

Вот моя проблема: я хочу, чтобы два отдельных объекта ссылались и обновляли атрибуты друг друга.

Итак, я попытался сделать это (я строю шахматы):

 # white.py
 class White(object):
 ...
      def move_white_piece(self):
           from black import Black
           black_object = Black()
           # ...

Причина, по которой я импортирую в функцию, заключается в том, что без этого возникает циклическая зависимость (т. е. белые еще не знают о черных, так как белые были объявлены первыми). Это исправляет AttributeError (теперь класс определен). Однако это поднимает новую проблему, когда теперь я использую новый объект (а не текущие атрибуты) внутри функции каждый раз. Мне нужно использовать один объект во всей моей программе. Возможно ли это?

У меня никогда не было этой проблемы в C ++ из-за предварительных объявлений и прототипов.

1 Ответ

1 голос
/ 26 апреля 2020

Я не уверен, что всегда плохо иметь два объекта, которые ссылаются друг на друга. Как бы то ни было, что я нахожу необычным, так это то, что вы создаете экземпляр для черного элемента с помощью метода move_white_piece. Конечно, это метод, который нужно вызывать повторно. Планируете ли вы создавать новую черную фигуру каждый раз, когда белые должны сделать ход? Это мало что значит для меня. Что имеет больше смысла, так это:

from black import Black

class White:

    def __init__(self):
        self.black_piece = Black() # create black piece when we are created
        black_piece.set_white_piece(self) # give black piece a reference to ourself

    def move_white_piece(self):
        # whatever

, а затем класс Black:

class Black:

     def set_white_piece(self, white_piece):
         self.white_piece = white_piece

Альтернативный стиль:

class White:

    def __init__(self):
        self.black_piece = Black(self) # create black piece when we are created

    def move_white_piece(self):
        pass

class Black:
    def __init__(self, white_piece):
        self.white_piece = white_piece

Это вопрос вкуса и / или требования.

Но подождите, потому что есть еще:

Если у вас нет очень особой причины для этого , не следует Не будьте отдельным классом Black и White, если правила и стратегии для обеих цветных фигур точно такие же, например, как в стандартной игре в шахматы. Конечно, один цвет должен сделать первый ход, и с этого момента фигуры чередуются. Но пока вы реализуете игру, в которой правила и стратегии для черного и белого одинаковы, черный и белый должны быть двумя экземплярами одного класса.

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