Задача: сразу все эти числа обратить в 0 одной командой (числа могут храниться в разных объекта). Представим, что у нас есть класс, который описывает спортивную команду, и в объекте этого класса хранится текущее количество очков в игре. Когда мы начинаем новую игру, у всех команд количество очков должно стать нулём. Написать дескриптор данных, к которому будут предъявляться следующие требования:
инициализация дескриптора внутри класса выглядит так: class Team: score = Nuller(), при присвоении нового значения в поле-дескриптор score объекта team = Team() это значение сохраняется внутри объекта team, при получении значения из поля-дескриптора score объекта team = Team() это значение берется из объекта team, класс Nuller содержит метод класса null, который присваивает 0 во все поля-дескрипторы объектов-владельцев. Для этого проще всего внутри класса Nuller хранить ссылки на все объекты-владельцы этого дескриптора, при удалении значения из объекта-владельца (с помощью оператора del) удаляется и ссылка из класса Nuller на этот объект.
Код:
Пример исполнения:
Нужно учесть случай, что в классе создается больше одного Nuller.
Ошибка в строке del Nuller.owners_of_nullers[instance]. Скорее всего в тесте один Nuller из объекта удалили и соответственно сам объект из списка owners_of_nullers. А при удалении второго Nuller объекта в списке owners_of_nullers уже нет, и возникает исключение.
Как это сделать? Подскажите, мозг кипит.
инициализация дескриптора внутри класса выглядит так: class Team: score = Nuller(), при присвоении нового значения в поле-дескриптор score объекта team = Team() это значение сохраняется внутри объекта team, при получении значения из поля-дескриптора score объекта team = Team() это значение берется из объекта team, класс Nuller содержит метод класса null, который присваивает 0 во все поля-дескрипторы объектов-владельцев. Для этого проще всего внутри класса Nuller хранить ссылки на все объекты-владельцы этого дескриптора, при удалении значения из объекта-владельца (с помощью оператора del) удаляется и ссылка из класса Nuller на этот объект.
Код:
Код:
class Nuller:
owners_of_nullers = {}
def __set_name__(self, owner, name):
self.name = name
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value=0):
instance.__dict__[self.name] = value
Nuller.owners_of_nullers[instance] = self.name
def __delete__(self, instance):
del Nuller.owners_of_nullers[instance]
del instance.__dict__[self.name]
@classmethod
def null(cls):
for instance, name in Nuller.owners_of_nullers.items():
instance.__dict__[name] = 0
Пример исполнения:
Код:
class Team:
score = Nuller()
team1 = Team()
team2 = Team()
team1.score = 5
print(team1.score)
# 5
team2.score = 28
print(team2.score)
# 28
Nuller.null()
print(team1.score, team2.score)
#0 0
team1.score = 10
del team2.score
Nuller.null()
print(team1.score)
#0
Нужно учесть случай, что в классе создается больше одного Nuller.
Ошибка в строке del Nuller.owners_of_nullers[instance]. Скорее всего в тесте один Nuller из объекта удалили и соответственно сам объект из списка owners_of_nullers. А при удалении второго Nuller объекта в списке owners_of_nullers уже нет, и возникает исключение.
Как это сделать? Подскажите, мозг кипит.