Найти - Пользователи
Полная версия: Дескриптор, нужен способ обратить числа в 0 одной командой
Начало » Python для новичков » Дескриптор, нужен способ обратить числа в 0 одной командой
1
Еленочка
Добрый день, запуталась.
Мне необходимо сделать дескриптор. Что имею - получаю значение 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
В общем, данный код работал. При написании вопроса, заметила что у меня ошибка в MyClass должна быть строчка
 score = DescriptorToNull()
(не core, а score). После этого вообще всё развалилось.:(
Вызов для тестирования такой:
 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

Помогите разобраться, уже не понимаю куда двигаться.
doza_and
Поскольку у вас все хитро, напишите нам просто какой из паттернов программирования вы реализуете.
Rodegast
А ещё напиши какая у тебя задача и зачем тебе дескрипторы… Список list_owner скорее всего должен быть атрибутом класса.
Еленочка
Задача: нам нужно хранить некоторые числа внутри абсолютно разных объектов, также нужен способ сразу все эти числа обратить в 0 одной командой. Представим, что у нас есть класс, который описывает спортивную команду, и в объекте этого класса хранится текущее количество очков в игре. Когда мы начинаем новую игру, у всех команд количество очков должно стать нулём. Такой функционал можно реализовать, написав дескриптор данных, к которому будут предъявляться следующие требования:
- инициализация дескриптора внутри класса выглядит так: score = DescriptorToNull()
- при присвоении нового значения в поле-дескриптор score объекта team = MyClass() это значение сохраняется внутри объекта
-при получении значения из поля-дескриптора score объекта MyClass это значение берется из объекта t
-класс DescriptorToNull содержит метод класса null, который присваивает 0 во все поля-дескрипторы объектов-владельцев. Для этого проще всего внутри класса хранить ссылки на все объекты-владельцы этого дескриптора
-при удалении значения из объекта-владельца (с помощью оператора del) удаляется и ссылка из класса DescriptorToNull на этот объект
Примечания
Подсказка: для этого нужно хранить внутри дескриптора ссылки на все содержащие его классы и список названий атрибутов, в которых записана ссылка на дескриптор (названия можно получить, например, через __dict__ объекта, сравнив класс атрибута с классом-дескриптором).
doza_and
Поскольку у вас все хитро, напишите нам просто какой из паттернов программирования вы реализуете.
/
Rodegast
А ещё напиши какая у тебя задача и зачем тебе дескрипторы… Список list_owner скорее всего должен быть атрибутом класса.
Еленочка
Это учебное задание из обучающего курса, как я понимаю, у него нет какого-либо практического применения, а реализовать надо.
Rodegast
> нам нужно хранить некоторые числа внутри абсолютно разных объектов

Звучит как то стрёмно…

> у нас есть класс, который описывает спортивную команду, и в объекте этого класса хранится текущее количество очков в игре

Это не правильно. У тебя должен быть отдельный объект для игры и в нём нужно хранить счёт.

> Это учебное задание из обучающего курса

Насколько я понял должно быть примерно вот так:
 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”)

xam1816
вот так попробуйте
 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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB