Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 23, 2010 15:05:34

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

Указатель на getter

Пусть есть класс, у которого определён 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.



Офлайн

#2 Сен. 23, 2010 15:54:46

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Указатель на getter

А если это будет не переменная-указатель, а функция? Тогда можно сделать так:

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)

Офлайн

#3 Сен. 23, 2010 16:02:42

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

Указатель на getter

Не подойдёт. У меня есть dict, в котором лежат некоторые тестовые данные. Эти данные должны вставляться в базу. В базе есть unique-поле.
Соответствующий элемент dict-а должен изменяться, но при этом должен с точки зрения кода оставаться “значением”, а не функцией.

Вот я и думаю, можно ли сделать ссылку с dict-а на getter?



Отредактировано (Сен. 23, 2010 16:03:59)

Офлайн

#4 Сен. 23, 2010 16:16:53

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Указатель на getter

А какого типа значения? Если, например, они типа 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).

К сожалению, в питоне нет неявного приведения типа, задаваемого пользовательским оператором, как в С++. Поэтому простого решения (переменная-указатель) без изменения кода, где используется словарь (или самого словаря), не добиться.



Отредактировано (Сен. 24, 2010 08:23:27)

Офлайн

#5 Сен. 23, 2010 21:01:23

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Указатель на getter

Я бы посоветовал переопределить __getitem__ у вашего словарика таким образом, чтобы он дереференсил значение, если оно некоего заранее известного типа, лучше своего, скажем Ref. Тогда снаружи все будет выглядеть так, как вы хотите, только использовать нужно будет этот нестандартный словарик.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version