Найти - Пользователи
Полная версия: Десхреньтор и его родственники.
Начало » Python для экспертов » Десхреньтор и его родственники.
1
li_4
Добрый вечер, имею смутное представление о дескрипторах и свойствах, так как знакомлюсь с ними в первый раз. Коротко, что я непонятно:
 class De:
    def __init__(self):
        self.common = 0
    def __get__(self, instance, owner):
        return self.common
    def __set__(self, instance, value):
        self.common = value
    def __delete__(self, instance):
        del self.common #??? Протокол обосрали
class Me:
    at = De()
    def __init__(self):
        self.name = 'Hello'
b = Me()
print(b.at)

1.) Почему если мы присвоим at к экземпляру, а не к классу, то Pyhon не будет обрабатывать операции “__get__” - дескриптора, а будет просто выводить нахождение дескриптора в памяти?
2.)Как дескриптор может самоудалить себя? При его удалении в __delete__ создаётся рекурсия. Но если мы будем удалять просто атрибут common дескриптора, то будет нарушаться протокол дескриптора.

Свойства:
 class Me:
    def __init__(self):
        self.attr = 10
    @property
    def bomb(self):
        return 'Something'
    @bomb.setter
    def bomb(self, value):
        self.attr = value
    @bomb.deleter
    def bomb(self):
        del self.attr
b = Me()
print(b.bomb)
b.bomb = 10000

1.) Почему вечно приходится писать одно и тоже название метода (bomb), чтобы работали свойства? Почему мы не можем написать
 def cond():...
и прикрепить наш декоратор bomb к нему? Ведь это не влияет на декоратор:
  bomb = bomb.setter(cond) # Возможно где-то ошибка (голова не хочет трудиться моя) 

В общем:
1.) В чём принципиальное различие свойств от дескрипторов ( где-то я слышал, что это одно и тоже, но тем не менее хочется полную версию)
2.) Часто ли вам приходится писать дескрипторы?
3.) А свойства использовать часто приходится? (просто @property не в счёт (@property.setter и т.д в счёт.))
4.) Скорость полёта бабочки Паридес Аркас?

P.S Моё представление о дескрипторах и свойствах: Ещё один ненужный слой логики.
FishHook
li_4
Почему вечно приходится писать одно и тоже название метода (bomb)
Нифига не приходится
 # -*- coding:utf-8 -*-
  
class Me:
    def __init__(self):
        self.attr = 10
  
    @property
    def bomb(self):
        return self.attr
  
    @bomb.setter
    def c(self, value):
        self.attr = value
  
m = Me()
m.c = 3
print(m.bomb)
>>> 3

>>В чём принципиальное различие свойств от дескрипторов
Свойства (property) реализованы через дескрипторы. В чем принципиальное отличие фарша от котлет?

>>Часто ли вам приходится писать дескрипторы?
Дескрипторы обычно юзают в библиотечном коде, в прикладном они не очень нужны

>>А свойства использовать часто приходится?
Свойства - это просто синтаксический сахар. Можете писать вообще без свойств в стиле Java, где все сеттеры и геттеры - обычные методы setX(), getX(). Они не необходимы. Можете использовать, можете не использовать, дело вкуса. Я использую.

>>Скорость полёта бабочки Паридес Аркас?
У нас на форуме матом не выражаются

>>Ещё один ненужный слой логики.
Никто не заставляет. @classmethod - полезный декоратор или ненужный слой логики? Он, еслив что, реализован через дескрипторы.
li_4
FishHook
FishHook
Нифига не приходится
Как я понял на практике, и в вашем коде - декораторы дескрипторы пишутся изначально для специфического атрибута? И они всего лишь изменяют стандартные операции чтения\изменения? И мой декоратор дескриптор реализован абсолютно неправильно. Или же всё таки такой подход существует и можно реализовывать поведение атрибута внутри него самого?
FishHook
li_4
Для начала, я бы на вашем месте разобрался, что такое декоратор в питоне. Дескрипторы и декораторы это настолько далекие друг от друга понятия, что смешивать их в одной проблематике никак нельзя.
li_4
FishHook
Да, неплохой совет. Но жопа в том что лутц ставит сначала дескрипторы и свойства в программу обучения, а потом уже декораторы. Мне дали представление что такое декораторы ему и следую.
li_4
FishHook
Я дико извиняюсь, я перепутал в своём сообщение декоратор с дескриптором (не знаю о чём тогда думал)
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