A property
является дескриптором . Он знает, где взять и установить _my_name
, потому что это то, что ваши методы получения и установки говорят ему получить и установить. Вот простой пример того, как дескриптор внутренне работает:
class MyProperty:
def __init__(self, name):
# The name of the property we are wrapping
self.name = name
def __get__(self, instance, owner):
# Property was requested from the class, not an instance
if instance is None:
return self
return getattr(instance, self.name)
def __set__(self, instance, value):
# Don't overwrite ourself...
if instance is None:
return
setattr(instance, self.name, value)
class Person:
def __init__(self, input_name):
self._my_name = input_name
# Define my_name, that will get/set _my_name
my_name = MyProperty('_my_name')
jack = Person('Jack')
print(jack.my_name)
jack.my_name = 'Jane'
print(jack.my_name)
Свойство работает аналогичным образом, где он запоминает свои определенные обратные вызовы getter, setter и delete и вызывает их, когда дескриптор получен / назначен.