При определении встроенного свойства python с помощью @property, как объект свойства отличает установщик от метода получателя, при условии, что они перегружены (имеют одно и то же имя)?
class A:
def __init__(self):
self._x = 12
@property
def x(self) -> int:
return self._x
@notifiable # strangely this stacks on both setter and getter
@x.setter
def x(self, val: int):
self._x = val
Если яопределить собственный декоратор свойств, скажем:
class my_property:
def __init__(self, getter):
print("__init__ getter %s:" % getter)
def setter(self, setter: FunctionType):
print("setter: %s" % setter)
class B:
def __init__(self):
self._val = 44
@my_property
def x(self):
return self._val
@x.setter
def x(self, val):
self._val = val
Выполнение кода приводит к следующему выводу
__init__ getter <function B.x at 0x7ff80c5e1620>:
setter: <function B.x at 0x7ff80c5e1620>
Функции getter и setter, передаваемые декоратору, являются одной и той же функцией,но они должны быть разными функциями.
Если я использую аннотацию, подобную этой:
class C:
def __init__(self):
self._val = 44
@my_property
def x(self):
return self._val
@x.setter
def set_x(self, val):
self._val = val
Как и ожидалось, печатается другая функция.
__init__ getter <function C.x at 0x7f529132c6a8>:
setter: <function C.set_x at 0x7f529132c6a8>
КакPython решает эту проблему с помощью встроенного @property?Относится ли декоратор к пользовательским декораторам?