Создание привязки одного класса к другому Python

Каким образом возможно сделать привязку класса к другому в Python? (чтобы привязанный класс всегда имел ссылку на основной) я просто хочу скопировать всю эту конструкцию при помощи copy.deepcopy(), можно ли это сделать только с родительским классом, так, чтобы все ссылки из образовавшихся вместе с ним привязанных классов вели именно к нему?
Пример (реальная ситуация специфична, но данный пример намного лучше иллюстрирует, то, что я хочу получить):
Допустим я хочу сделать программу, которая играет в шахматы. я Создал отдельные классы: King, Piece, Board. В Board все классы, которые надо привязать хранятся в списках. Алгоритм программы - перебор вариантов. В классе Board функция move() такова, что изменяет объект, а не возвращает новый, измененный. Каждый раз, когда я хочу перебрать все возможные ходы, я выолняю:

#code

for move in get_legal_moves(main_board, side):
   try_board = copy.deepcopy(main_board) #Все фигуры при копировании 
   try_board.move(move)                  #считают, что принадлежат не try_board, а main_board, 
                                         #из-за чего невозможно получить все возможные хода

#code

когда я выполняю copy.deepcopy() мне надо во всех появившихся объектах заменить ссылки на нужные. Можно конечно использовать функцию, но прописывать один и тот же алгоритм для всех классов, которые я собираюсь копировать - бред (названия переменных просто разные). Поэтому хочется чтобы это делалось как-то автоматически.


Ответы (1 шт):

Автор решения: MiniMax

На основании этого и предыдущего вопросов, я понял задачу следующим образом:

  • создание объектов Wheel разбросано по коду и не привязано к чему-либо: там два объекта, здесь три объекта и т.д.

  • ссылки на все созданные объекты Wheel должны где-то храниться, чтобы по ним можно было пробежаться в цикле.

  • ? объект Wheel должен иметь ссылку на объект в котором он используется, в данном случае Car.

    Однако в предыдущем вопросе был такой пример:

     a = Myclass()
     b = Myclass()
     c = Myclass()
     arr = [Myclass(), Myclass()]
    

    Что не вяжется с предыдущим утвержедением, так как в данном случае отсутствует объект-композитор (от слова composite - составной, комбинированный), указатель на который надо хранить...

Можно сделать так:

Класс Wheel хранит ссылки на свои экземпляры в атрибуте класса. Каждый экземпляр класса Wheel имеет ссылку на объект в котором он был создан. name в классе Car добавлено для наглядности.

import weakref

class Wheel:
    weakrefs_set = weakref.WeakSet()
    def __init__(self, car):
        self.__class__.weakrefs_set.add(self)
        self.car = car

class Car:
    def __init__(self, name):
        self.name = name
        self.wheels = [ 
                        Wheel(self),
                        Wheel(self),
                        Wheel(self),
                        Wheel(self)
                    ]

a = Car("Car_1")
b = Car("Car_2")

for wheel in Wheel.weakrefs_set:
    print(wheel, f"\tcar_name: {wheel.car.name}")

Output

<__main__.Wheel object at 0x7fecd7cbca20>   car_name: Car_1
<__main__.Wheel object at 0x7fecd7c77828>   car_name: Car_2
<__main__.Wheel object at 0x7fecd7c77860>   car_name: Car_2
<__main__.Wheel object at 0x7fecd7c77898>   car_name: Car_2
<__main__.Wheel object at 0x7fecd7cb64a8>   car_name: Car_1
<__main__.Wheel object at 0x7fecd7c778d0>   car_name: Car_2
<__main__.Wheel object at 0x7fecd7cc4908>   car_name: Car_1
<__main__.Wheel object at 0x7fecd7cc49e8>   car_name: Car_1

Похожий вопрос на английском: Printing all instances of a class

→ Ссылка