4kpt_V
И как Вы думаете? В какой момент выполняется эта строка?
Я согласен, если бы класс Name был обычным классом без протокола дескриптора. Дело в том, что аналогичное объявление свойств класса, но с наличием атрибутов в этом же классе (в примере - класс D), отрабатывает:
class Nn: # дескриптор свойств nn
""" счётчик обращений к name """
def __get__(self, instance, owner):
return owner._nn
def __set__(self, instance, value):
raise AttributeError('Нельзя изменить счётчик')
def __delete__(self, instance):
raise AttributeError('Нельзя удалить счётчик')
class Name: # дескриптор свойств name
""" имя экземпляра """
def __get__(self, instance, owner):
owner._nn += 1
return '[%d] %s' % (owner._nn, instance._name)
def __set__(self, instance, value):
instance._name = value
def __delete__(self, instance):
raise AttributeError('Нельзя удалить имя экземпляра')
class D: # класс-клиент
def __init__(self):
D._nn = 0
self._name = 'по-умолчанию'
nn = Nn()
name = Name()
#---------------------------------------------------------------------------------
if __name__ == '__main__':
a, b, c = D(), D(), D()
a.name = 'my name is A'
b.name = 'my name is B'
c.name = 'my name is C'
print(a.name)
print(b.name)
print(c.name)
print(a.nn)
print(b.nn)
print(c.nn)
Результаты: ================= RESTART: D:\web.py\attrs\mydescriptors.py =================
[1] my name is A
[2] my name is B
[3] my name is C
3
3
3
>>>
В этом примере свойство nn - общий для всех экземпляров счётчик обращений к свойству name, а name - имя экземпляра (для каждого своё)