Уведомления

Группа в Telegram: @pythonsu

#1 Июль 25, 2013 11:40:59

yiooxir
Зарегистрирован: 2012-10-25
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

как переопределить метод присваивания у какого-то метода объекта. К примеру есть объект obj и у этого объекта есть метод obj.mth1 Я хочу, чтобы при написании такой конструкции obj.mth = 2, он не заменил значение этого метода на 2, а произвел со значением какое-то действие. (по аналогии в C++ это перегрузка оператора ‘=’ )
Какой внутренний метод в python отвечает за перегрузку данного оператора ?

Офлайн

#2 Июль 25, 2013 12:46:54

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

class Foo(object):
    def __init__(self):
        self.value = None
    @property
    def x(self):
       return self.value
    @x.setter
    def x(self, value):
        print "set value to", value
        self.value = value
f = Foo()
f.x = 56
print f.x



Офлайн

#3 Июль 25, 2013 14:28:42

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

FishHook
Подскажите, пожалуйста, а почему нельзя использовать __setattr__. Заранее благодарен.



Офлайн

#4 Июль 25, 2013 14:35:29

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

4kpt,
насколько я понял ТСа ему гугл не рассказал, как реализовать в питоне properties.
“obj.mth = 2, он не заменил значение этого метода на 2, а произвел со значением какое-то действие.”
Если он имел в виду нечто другое, то я его не понял. В любом случае, перегрузка оператора присваивания мне видится не самым удачным решением.



Офлайн

#5 Июль 25, 2013 14:58:58

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

Кстати, как Вы считаете, будет ли рациональным при наличии множества таких атрибутов, использовать дескриптор?

P.S. Пытаюсь для себя поставить все точки над i. Часто сталкиваюсь с такой необходимостью.



Отредактировано 4kpt (Июль 25, 2013 14:59:51)

Офлайн

#6 Июль 25, 2013 16:35:23

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

4kpt
Кстати, как Вы считаете, будет ли рациональным при наличии множества таких атрибутов, использовать дескриптор?P.S. Пытаюсь для себя поставить все точки над i. Часто сталкиваюсь с такой необходимостью.
Если я не ошибаюсь, то функция property как раз возвращает дескриптор, а декораторы - не более чем синтаксический сахар.



Офлайн

#7 Июль 25, 2013 17:13:48

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

Спасибо за ответ. Плюсанул за потраченное время :)



Офлайн

#8 Июль 25, 2013 17:26:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

4kpt
Спасибо за ответ. Плюсанул за потраченное время
глянь



Офлайн

#9 Июль 25, 2013 17:40:21

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

Ядреная помесь :) Метод превратить в декскриптор с использованием декоратора. Спасибо. Взял на вооружение. Правда еще не знаю, где применить, но все же…



Отредактировано 4kpt (Июль 25, 2013 18:06:41)

Офлайн

#10 Июль 25, 2013 18:06:50

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Переопределить метод присваивания у объекта

P.S. Вопросик в-догонку (если можно). Зачем Вы в функцию передавали cls?



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version