Ответы пользователя по тегу Декодеры
  • Возможно ли использовать setter без @property?

    tumbler
    @tumbler Куратор тега Python
    бекенд-разработчик на python
    class A:
        @field.setter  # NameError
        def field_setter(self, value):
            self.__field = value


    На момент попытки выполнения field.setter в локальном контексте нет имени "field", поэтому воспользоваться задней половиной от property не получится. Но если вспомнить, что property - это фабрика дексрипторов, то можно подшаманить:

    class setter:
        def __init__(self, name):
            self.name = name
        def __call__(self, setter_func):
            self.setter_func = setter_func
            return self
        def __get__(self, obj, type=None):
            return getattr(obj, f'_{obj.__class__.__name__}__{self.name}')
        def __set__(self, obj, value):
            self.setter_func(obj, value)
    
    class A:
        @setter('field')
        def field_setter(self, value):
            self.__field = value
    
    a = A()
    a.field_setter = 1
    b = a.field_setter
    Ответ написан
    1 комментарий