Форум сайта python.su
кто? класс?
я имел ввиду как в книге у Россума сделать
class VirtualAttributes:
__vdict = None
__vdict_name = locals().keys()[0]
def __init__(self):
self.__dict__[self.__vdict_name] = {}
def __getattr__(self, name):
return self.__vdict[name]
def __setattr__(self, name, value):
self.__vdict[name] = value
if key == 'font_height':
.....
elif key == 'border_width':
......
elif ....
........
еще много много раз
........
else:
.......
Офлайн
Проверь профайлером, узнаешь скорость.
Офлайн
Переопределять __setattr__ без особой нужды - далеко не лучшая идея. Дескрипторы лучше. А если в классе две сотни аттрибутов - может, что-то не в порядке с дизайном-архитектурой?
Офлайн
iceМожно еще такой хук использовать, если речь идет о “удобстве”:
а если вообще делать через __getattr__/__setattr__? то есть заводить словарь внутри класса и проверять куда обращаются? это долго будет по времени? особенно если обращений к классу много.
вот тут у нокии есть классы, если я пытаюсь что-то изменить, что менять нельзя, у меня возникает ексепшн “рид онли фиелд”, а те, которые можно менять оно меняет и сразу меняет поведение объекта (вызывается функция-коллбэк моя), как это сделано? кроме вышеозначенных setattr и getattr есть способы?
идия с динамик проперти не плохо, но когда полей не много.
хм … может правда завести словарь. тогда потом проще будет добавлять новые свойства.
$ easy_install rwproperty
from rwproperty import setproperty, getproperty
class Foo(object):
@setproperty
def blah(self, value):
...
@getproperty
def blah(self):
...
Офлайн
А если в классе две сотни аттрибутов - может, что-то не в порядке с дизайном-архитектурой?ну не 2 сотни. Но десяток-другой, я думаю, может набраться.
Отредактировано (Окт. 16, 2008 07:52:13)
Офлайн
astoonне могу такого для симбиана найти.
from rwproperty import setproperty, getproperty
Офлайн
iceВозьми с PyPI и положи в симбиан. Там один файлик.astoonне могу такого для симбиана найти.
from rwproperty import setproperty, getproperty
Отредактировано (Окт. 17, 2008 00:35:37)
Офлайн
PooHнемного погуглив нашёл такое решение:
У property есть один неприятный момент при наследовании:class A(object):
def _get_name(self):
return 'A'
name = property(_get_name)
class B(A):
def _get_name(self):
return 'B'
In [10]: b.name
Out[10]: 'A'
>>> class A(object):
def _get_name(self):
return 'A'
name = property(fget = lambda self:self._get_name())
>>> class B(A):
def _get_name(self):
return 'B'
>>> a = A()
>>> b = B()
>>> a.name
'A'
>>> b.name
'B'
Офлайн
Leron+5! Глядя на такое всегда хочется сказать “Ну как я сам не допер!” ;)
немного погуглив нашёл такое решение:
Офлайн