Форум сайта python.su
Добрый день, запуталась.
Мне необходимо сделать дескриптор. Что имею - получаю значение value, значение сохраняю во владельцах . Не могу разобраться, как написать метод. Он должен присваивать 0 во все поля объектов-владельцев.
И при удалении значения из объекта-владельца удаляется и ссылка из класса DescriptorToNull на этот объект (это еще не реализовано).
class DescriptorToNull: """Это класс дескриптора.""" def __init__(self): self.val = None self.list_owner = [] def __get__(self, instance, owner): return self.val def __set__(self, instance, value): instance.__dict__["n_value"] = value self.list_owner.append(self) #хотела создать список владельцев, def null(self): pass #вот здесь не понимаю что дальше def __set_name__(self, klass, name): self._name = name class MyClass: """Это класс владелец дескрипторов.""" core = DescriptorToNull() def __init__(self): self.n_value = None
score = DescriptorToNull()
t1 = MyClass() t2 = MyClass() t1.score = 5 print(t1.score) #5 t2.score = 28 print(t1.score, t2.score) # 5 28 DescriptorToNull.null() print(t1.score, t2.score) # 0 0 del team2.score
Офлайн
Поскольку у вас все хитро, напишите нам просто какой из паттернов программирования вы реализуете.
Офлайн
А ещё напиши какая у тебя задача и зачем тебе дескрипторы… Список list_owner скорее всего должен быть атрибутом класса.
Офлайн
Задача: нам нужно хранить некоторые числа внутри абсолютно разных объектов, также нужен способ сразу все эти числа обратить в 0 одной командой. Представим, что у нас есть класс, который описывает спортивную команду, и в объекте этого класса хранится текущее количество очков в игре. Когда мы начинаем новую игру, у всех команд количество очков должно стать нулём. Такой функционал можно реализовать, написав дескриптор данных, к которому будут предъявляться следующие требования:
- инициализация дескриптора внутри класса выглядит так: score = DescriptorToNull()
- при присвоении нового значения в поле-дескриптор score объекта team = MyClass() это значение сохраняется внутри объекта
-при получении значения из поля-дескриптора score объекта MyClass это значение берется из объекта t
-класс DescriptorToNull содержит метод класса null, который присваивает 0 во все поля-дескрипторы объектов-владельцев. Для этого проще всего внутри класса хранить ссылки на все объекты-владельцы этого дескриптора
-при удалении значения из объекта-владельца (с помощью оператора del) удаляется и ссылка из класса DescriptorToNull на этот объект
Примечания
Подсказка: для этого нужно хранить внутри дескриптора ссылки на все содержащие его классы и список названий атрибутов, в которых записана ссылка на дескриптор (названия можно получить, например, через __dict__ объекта, сравнив класс атрибута с классом-дескриптором).
/doza_and
Поскольку у вас все хитро, напишите нам просто какой из паттернов программирования вы реализуете.
Rodegast
А ещё напиши какая у тебя задача и зачем тебе дескрипторы… Список list_owner скорее всего должен быть атрибутом класса.
Офлайн
Это учебное задание из обучающего курса, как я понимаю, у него нет какого-либо практического применения, а реализовать надо.
Офлайн
> нам нужно хранить некоторые числа внутри абсолютно разных объектов
Звучит как то стрёмно…
> у нас есть класс, который описывает спортивную команду, и в объекте этого класса хранится текущее количество очков в игре
Это не правильно. У тебя должен быть отдельный объект для игры и в нём нужно хранить счёт.
> Это учебное задание из обучающего курса
Насколько я понял должно быть примерно вот так:
class DescriptorToNull: list_owner = {} def __get__(self, instance, owner): return instance.n_value def __set__(self, instance, value): instance.n_value = value self.list_owner[id(instance)] = instance def __delete__(self, instance): del self.list_owner[id(instance)] @classmethod def null(cls): for x in cls.list_owner: cls.list_owner[x].n_value = 0 class MyClass: score = DescriptorToNull() def __init__(self): self.n_value = 0
Офлайн
Rodegast спасибо что откликнулся:D, и не задумалась об использовании несвязанного метода. Код тестирование пока не прошел, вывалился с ошибкой (“Значение дескриптора изменилось из-за работы с другим полем-дескриптором класса DescriptorToNull”)
Отредактировано Еленочка (Дек. 21, 2021 00:50:46)
Офлайн
вот так попробуйте
class DescriptorToNull: dict_instances = {} name = None def __get__(self, instance, owner): return instance.name def __set__(self, instance, value): instance.name = value self.dict_instances[id(instance)] = instance def __delete__(self, instance): del self.dict_instances[id(instance)] def __set_name__(self, owner, name): self.name = name @classmethod def null(cls): for x in cls.dict_instances: cls.dict_instances[x].name = 0 class MyClass: score = DescriptorToNull() def __init__(self): self.score = 0
Офлайн