Основная цель следующего модуля - предоставить своего рода «постоянную» семантику для некоторых имен.Переопределенный доступ к атрибуту не работает (как ожидалось)
class ConstantError(Exception):
def __init__(self, msg):
self._msg = msg
class Constant(object):
def __init__(self, name):
self._name = name
def __get__(self, instance, owner):
return instance._content[self._name]
def __set__(self, instance, value):
raise ConstantError, 'Illegal use of constant'
class Constants(object):
def __init__(self, content):
self._content = content
for k in self._content:
setattr(self, k, Constant(k))
num_const = Constants({
'one': 1,
'two': 2
})
При использовании:
>>> from const import *
>>> dir(num_const)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_content', 'one', 'two']
Так one
и two
есть, но доступ атрибут diappointing:
>>> num_const.one
<const.Constant object at 0x7faef4871710>
>>>
Где я пустошь ожидать 1
в этом случае. Где я ошибаюсь?
Так вот в чем смысл. Не могли бы вы пролить свет на обоснование такого поведения? Я имею в виду, что еще может пойти не так, если протокол дескриптора будет работать и с экземплярами класса? –
Я не знаю, почему именно. Проблемы производительности для доступа к атрибутам? Или что было бы трудно получить доступ к самому атрибуту (дескриптору), не вызвав его. – u0b34a0f6ae