Найти - Пользователи
Полная версия: Указатель на getter
Начало » Python для экспертов » Указатель на getter
1
axe
Пусть есть класс, у которого определён 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
Хочется создать переменную-указатель, чтобы при обращении к ней на самом деле доставалось значение v.value.
Isem
А если это будет не переменная-указатель, а функция? Тогда можно сделать так:
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
axe
Не подойдёт. У меня есть dict, в котором лежат некоторые тестовые данные. Эти данные должны вставляться в базу. В базе есть unique-поле.
Соответствующий элемент dict-а должен изменяться, но при этом должен с точки зрения кода оставаться “значением”, а не функцией.

Вот я и думаю, можно ли сделать ссылку с dict-а на getter?
Isem
А какого типа значения? Если, например, они типа 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
Естественно, у словаря, правда, придется переопределить метод __getitem__ , который должен явно приводить значение к типу int, или после обращения к словарю dict, если использовать стандартный словарь, явно писать: int(dic).

К сожалению, в питоне нет неявного приведения типа, задаваемого пользовательским оператором, как в С++. Поэтому простого решения (переменная-указатель) без изменения кода, где используется словарь (или самого словаря), не добиться.
Ed
Я бы посоветовал переопределить __getitem__ у вашего словарика таким образом, чтобы он дереференсил значение, если оно некоего заранее известного типа, лучше своего, скажем Ref. Тогда снаружи все будет выглядеть так, как вы хотите, только использовать нужно будет этот нестандартный словарик.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB