Форум сайта python.su
Пусть есть класс, у которого определён getter и setter для атрибута value:
class GetterSetterTest(object):
def __init__(self, value):
self._value = value
def get_value(self):
return self._value
def set_value(self, value):
self._value = value
value = property(get_value, set_value)
v = GetterSetterTest(2)
print v.value
v.value = 3
print v.value
Офлайн
А если это будет не переменная-указатель, а функция? Тогда можно сделать так:
class DirectAttr:
def __init__(self, obj, attr):
self.obj = obj
self.attr = attr
def __call__(self):
return getattr( self.obj, self.attr )
class Value:
def __init__( self, value ):
self.value = value
val = Value( 23 )
direct_value = DirectAttr( val, 'value' )
print( direct_value() ) # 23
val.value = 78
print( direct_value() ) # 78
Отредактировано (Сен. 23, 2010 15:56:11)
Офлайн
Не подойдёт. У меня есть dict, в котором лежат некоторые тестовые данные. Эти данные должны вставляться в базу. В базе есть unique-поле.
Соответствующий элемент dict-а должен изменяться, но при этом должен с точки зрения кода оставаться “значением”, а не функцией.
Вот я и думаю, можно ли сделать ссылку с dict-а на getter?
Отредактировано (Сен. 23, 2010 16:03:59)
Офлайн
А какого типа значения? Если, например, они типа int или str, тогда можно переопределить функцию __int__
class DirectAttr:
def __init__(self, obj, attr):
self.obj = obj
self.attr = attr
def __int__(self):
return getattr( self.obj, self.attr )
class Value:
def __init__( self, value ):
self.value = value
val = Value( 23 )
direct_value = DirectAttr( val, 'value' )
print( int(direct_value) ) # 23
val.value = 45
print( int(direct_value) ) # 45
Отредактировано (Сен. 24, 2010 08:23:27)
Офлайн
Я бы посоветовал переопределить __getitem__ у вашего словарика таким образом, чтобы он дереференсил значение, если оно некоего заранее известного типа, лучше своего, скажем Ref. Тогда снаружи все будет выглядеть так, как вы хотите, только использовать нужно будет этот нестандартный словарик.
Офлайн