Создание привязки одного класса к другому 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 шт):
На основании этого и предыдущего вопросов, я понял задачу следующим образом:
создание объектов
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