Форум сайта python.su
4kpt_Vвсё понятно, что Вы пишите. В первом примере (с чего началось обсуждение) и в последнем (с клиентским классом D вместо класса SomeClass) присутствуют ДВА АНАЛОГИЧНЫХ ОБЪЯВЛЕНИЯ свойства (myName в SomeClass и name в D) с единственным отличием, а именно: в первом случае для хранения значения используется АТРИБУТ ЭКЗЕМПЛЯРА КЛАССА-ДЕСКРИПТОРА, а во втором - АТРИБУТ ЭКЗЕМПЛЯРА КЛАССА-КЛИЕНТА. Непонятно, почему второй вариант отрабатывает, а первый нет.
Что из того, что я написал Вам не понятно?
Офлайн
предлагаю продолжить завтра…
Офлайн
Внутри методов операции одинаковые?
Вы приводите два разных примера…
Офлайн
Хмм млин с чего бы начать?
Итак есть классы и есть инстансы(экземпляры классов). Класс это кагбэ шаблон по которому создаеться экземпляр. класс может содержать свои атрибуты а экземпляр свои. Вот банальный пример:
class Test(): a = 'я атрибут "а" класса Test' # это атрибут класса def __init__(self): self.b = 'я атрибут "b" экземпляра класса Test' # это атрибут инстанса if __name__ == '__main__': print(Test.a) print(Test.b)
я атрибут "а" класса Test Traceback (most recent call last): File "<модуль2>", line 7, in <module> AttributeError: type object 'Test' has no attribute 'b'
...... if __name__ == '__main__': test = Test() print(test.a) print(test.b) print('атрибуты инстанса:',test.__dict__) >>> >>> я атрибут "а" класса Test я атрибут "b" экземпляра класса Test атрибуты инстанса: {'b': 'я атрибут "b" экземпляра класса Test'} >>> >>>
..... if __name__ == '__main__': test = Test() test.a = 'я атрибут "а" экземпляра класса Test' print(test.a) print(test.b) print('атрибуты инстанса:',test.__dict__) print(Test.a) >>> я атрибут "а" экземпляра класса Test я атрибут "b" экземпляра класса Test атрибуты инстанса: {'a': 'я атрибут "а" экземпляра класса Test', 'b': 'я атрибут "b" экземпляра класса Test'} я атрибут "а" класса Test >>>
class Name(): # name descriptor def __init__(self): self.value = 'default name' def __get__(self, instance, owner): return self.value def __set__(self, instance, value): self.value = value def __delete__(self, instance): raise AttributeError('from Name.__delete__') class Test(): a = 'я атрибут "а" класса Test' # это атрибут класса c = Name() # это тоже атрибут класса def __init__(self): self.b = 'я атрибут "b" экземпляра класса Test' # это атрибут инстанса if __name__ == '__main__': test = Test() print('test.c =', test.c) test.c = 'John Smith' print('new name, test.c =',test.c) print('атрибуты инстанса:',test.__dict__) test2 = Test() print('another instance, test.c =',test2.c) >>> test.c = default name new name, test.c = John Smith атрибуты инстанса: {'b': 'я атрибут "b" экземпляра класса Test'} another instance, test.c = John Smith >>>
[code python][/code]
Отредактировано PEHDOM (Май 15, 2017 13:15:10)
Офлайн
Я всё понял. Когда для описания свойств (а лучше сказать - управляемых атрибутов) класса-клиента используется дескриптор, и описание свойств выглядит так:
class SomeClass: someProp = SomePropDescriptor() ....
Отредактировано alexgreg (Май 15, 2017 17:24:06)
Офлайн
alexgreg
alexgregАллелуйя!!!
Я всё понял. Когда для описания свойств (а лучше сказать - управляемых атрибутов) класса-клиента используется дескриптор, и описание свойств выглядит так:
Офлайн
Вот решение, к которому привело обсуждение:
Пишу код (Python 3.6.0):
class Nn: value = 0 def __get__(self, instance, owner): return Nn.value def __set__(self, instance, value): raise AttributeError('Нельзя изменить счётчик') def __delete__(self, instance): raise AttributeError('Нельзя удалить счётчик') class Name: def __init__(self): self.values = dict({}) def __get__(self, instance, owner): Nn.value += 1 return '[%d] %s' % (Nn.value, self.values.get(instance, 'по-умолчанию')) def __set__(self, instance, value): self.values[instance] = value # ключом является экземпляр класса-клиента def __delete__(self, instance): raise AttributeError('Нельзя удалить имя экземпляра') class SomeClass: nn = Nn() name = Name() #--------------------------------------------------------------------------------- if __name__ == '__main__': a = SomeClass() b = SomeClass() print(a.name) print(b.name) a.name = 'my name is A' print(a.name) print(b.name) print(a.nn) print(b.nn) print(a.__dict__) print(b.__dict__)
==================== RESTART: Dweb.py/attrs/testdesc.py ==================== [1] по-умолчанию [2] по-умолчанию [3] my name is A [4] по-умолчанию 4 4 {} {} >>>
Офлайн
БЛАГОДАРЮ ЗА ПОМОЩЬ
Офлайн