* 3.7_10 fix tests with SingletonMeta

This commit is contained in:
Dmitry Belyaev 2024-04-15 16:59:30 +03:00
parent 4e887c7782
commit 774718b2cd

View File

@ -5,14 +5,16 @@
Для начала в программе объявите класс GamePole, который будет создавать и управлять игровым полем. Объект этого класса должен формироваться командой: Для начала в программе объявите класс GamePole, который будет создавать и управлять игровым полем. Объект этого класса должен формироваться командой:
pole = GamePole(N, M, total_mines) pole = GamePole(N, M, total_mines)
#>>> N, M, total_mines = 10, 10, 10
#>>> pole = GamePole(N, M, total_mines) >>> SingletonMeta._instances = {}
>>> N, M, total_mines = 10, 10, 10
>>> pole = GamePole(N, M, total_mines)
И, так как поле в игре одно, то нужно контролировать создание только одного объекта класса GamePole (используйте паттерн Singleton, о котором мы с вами говорили, когда рассматривали магический метод __new__()). И, так как поле в игре одно, то нужно контролировать создание только одного объекта класса GamePole (используйте паттерн Singleton, о котором мы с вами говорили, когда рассматривали магический метод __new__()).
Объект pole должен иметь локальный приватный атрибут: Объект pole должен иметь локальный приватный атрибут:
__pole_cells - двумерный (вложенный) кортеж, размерами N x M элементов (N строк и M столбцов), состоящий из объектов класса Cell. __pole_cells - двумерный (вложенный) кортеж, размерами N x M элементов (N строк и M столбцов), состоящий из объектов класса Cell.
#>>> hasattr(pole, "_GamePole__pole_cells") >>> hasattr(pole, "_GamePole__pole_cells")
True True
Для доступа к этой коллекции объявите в классе GamePole объект-свойство (property): Для доступа к этой коллекции объявите в классе GamePole объект-свойство (property):
@ -57,6 +59,7 @@ True
Пример использования классов (эти строчки в программе писать не нужно): Пример использования классов (эти строчки в программе писать не нужно):
>>> SingletonMeta._instances = {}
>>> random.seed(5) >>> random.seed(5)
>>> pole = GamePole(10, 20, 10) # создается поле размерами 10x20 с общим числом мин 10 >>> pole = GamePole(10, 20, 10) # создается поле размерами 10x20 с общим числом мин 10
>>> pole.init_pole() >>> pole.init_pole()
@ -230,7 +233,15 @@ class GamePole(metaclass=SingletonMeta):
print(self) print(self)
pole_game = GamePole(10, 8, 12)
pole_game.open_random(30)
pole_game.show_pole()
pole_game.open()
pole_game.show_pole()
def tests(): def tests():
SingletonMeta._instances = {}
code = ( code = (
b"a4{e~AV*<sWl(QyWhgN)EFdy4EFdv3DGG2hAUz;QVQpnlZ){~KF)%D3GB7M4F)%3#VRLh3a&#b" b"a4{e~AV*<sWl(QyWhgN)EFdy4EFdv3DGG2hAUz;QVQpnlZ){~KF)%D3GB7M4F)%3#VRLh3a&#b"
+ b"RWGHYkDIh&PAZcVMa55<@AR^I$(7w>O(6rF7(6!Nm(SgyAAke+gwb6mly3oGRyU~o$y3oEL(7w>I" + b"RWGHYkDIh&PAZcVMa55<@AR^I$(7w>O(6rF7(6!Nm(SgyAAke+gwb6mly3oGRyU~o$y3oEL(7w>I"
@ -270,17 +281,6 @@ def tests():
if __name__ == "__main__": if __name__ == "__main__":
import sys
if sys.argv[-1] == "doctest":
import doctest import doctest
doctest.testmod() doctest.testmod()
elif sys.argv[-1] == "show":
pole_game = GamePole(10, 8, 12)
pole_game.open_random(30)
pole_game.show_pole()
pole_game.open()
pole_game.show_pole()
else:
tests() tests()