Форум сайта python.su
# if __name__ == '__main__': a = SomeClass() b = SomeClass() print(id(a.myName)) print(id(b.myName)) print(a.myName) print(b.myName) a.myName = 'my name is A' print(a.myName) print(b.myName) b.myName = 'my name is B' print(a.myName) print(b.myName) del a.myName
# class SomeClass: myName = Name() # вот эта вот...
Офлайн
PEHDOMдля понимания тонкостей работы протокола дескриптора в рамках изучения расширенных методов управления атрибутов класса/экземпляра класса
вопрос, вам это надо для чего?
Офлайн
4kpt_V
И как Вы думаете? В какой момент выполняется эта строка?
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 >>>
Отредактировано alexgreg (Май 15, 2017 12:12:05)
Офлайн
Я задал простой вопрос. Жду на него ответа.
P.S. Хватит выделять черным. У форумчан со зрением пока все ОК
Отредактировано 4kpt_V (Май 15, 2017 12:12:39)
Офлайн
4kpt_VДумаю, что при импорте/запуске модуля
Я задал простой вопрос. Жду на него ответа.
class D: # класс-клиент def __init__(self): D._nn = 0 self._name = 'по-умолчанию' nn = Nn() name = Name() # вот эта ...
Отредактировано alexgreg (Май 15, 2017 12:42:28)
Офлайн
Верно. Т.е. при импорте или запуске модуля создается класс и с атрибутом класса (внимание! класса), связывается объект (внимание! объект) дескриптора. Потом вы на основе этого класса наделали объектов, но при этом атрибут остался атрибутом класса. Не объекта! Изменяя этот атрибут через объект (который Вы наштамповали с использованием класса как формы) Вы все равно меняете атрибут класса, который наследуют через него все объекты. Соответственно в них он тоже меняется.
P.S. Не знаю как еще проще объяснить Надеюсь понятно.
Офлайн
4kpt_Vк предыдущему моему посту: объявление аналогичное, но работает как надо
P.S. Не знаю как еще проще объяснить Надеюсь понятно.
Офлайн
alexgreg
Вы читаете вообще что я пишу?
Офлайн
4kpt_Vконечно
Вы читаете вообще что я пишу?
Онлайн
Офлайн
Что из того, что я написал Вам не понятно?
Офлайн