Есть ли способ позволить объекту вызывать функцию после собственного уничтожения?[Python3] - PullRequest
0 голосов
/ 11 марта 2019

Мне нужна функция обратного вызова для del object


Пояснение

У меня есть Player Класс.

И Player может иметь объектыCard в его Player.hand = []

Card экземплярах можно уничтожить с помощью del <card_instance>

Если у Player нет Cards в его hand, игра

Чтобы проверить, что только когда это необходимо, я хочу, чтобы Card вызвал функцию Player.check_status(), которая проверяет, закончилась ли игра после ее собственного уничтожения .

Возможно ли это?


Код

class Player:
     self.hand = [...<Cards>...]

    def check_status(self):
         if self.hand == []:
             print("--- GAME OVER ---")

class Card:
     self.player = <Player_instance>

     def __del__(self):
          del self
          self.player.check_status() # <----- I want to do something like this

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Если ваш объект не привязан к какому-либо внешнему состоянию, которое нуждается в очистке, несмотря ни на что (например, дескриптор файла / сокет), использование __del__ обычно не является правильным выбором.Это признак того, что вы делаете что-то не так.Например, если вы завернули свой del в try...except, то сделайте что-нибудь еще, предполагая, что рука была изменена, и вы ошиблись.Объекты могут (временно) поддерживаться блоком try..except.del card это не то же самое, что card.__del__(), это НЕ гарантирует, что будет вызван __del__.

Аналогично, обычно вы хотите, чтобы ваш родитель управлял своими детьми, а ненаоборотИгрок контролирует свои карты, карты не контролируют игрока.

Просто будьте откровенны со своими действиями:

class Player:
    def __init__(self):
        self.hand = []

    def add_card(self, card):
        self.hand.append(card)

    def remove_card(self, card):
        self.hand.remove(card)
        if not self.hand:
            print('--- GAME OVER ---')
0 голосов
/ 11 марта 2019

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

Я думаю:

  1. Определить функцию подсчета количества карт на руках.
  2. Создать условный оператор, который проверяет, равна ли имеющаяся карточка 0. 0. 1008 *
  3. Создание функции завершения игры, которая может перезапустить игру.
...