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