Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 31, 2014 10:23:09

Tropick
Зарегистрирован: 2014-01-31
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

Доброго времени суток господа!!!
Совсем не давно начал курить Python, по этому очень не привычно и очень сложно вникать.
Вопрос троллям:
1) что лучше использовать магические геттеры сеттеры или @property

 
class Vector(object):

def __init__(self,x = 0, y = 0):
self.__dict__['x'] = x
self.__dict__['y'] = y

def __getattr__(self, name):
if name in self.__dict__:
return self.__dict__[name]

def __setattr__(self, name, value):
if name in self.__dict__:
self.__dict__[name] = value
# @property
# def x(self):
# return self.__dict__['x']

# @property
# def y(self):
# return self.__dict__['y']

# @x.setter
# def x(self, value):
# self.__dict__['x'] = value

# @y.setter
# def y(self, value):
# self.__dict__['y'] = value

Офлайн

#2 Янв. 31, 2014 11:29:44

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

геттеры и сеттеры или @property

Причём здесь тролли?

Офлайн

#3 Янв. 31, 2014 11:58:02

Tropick
Зарегистрирован: 2014-01-31
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

В том смысле, что принимаю конструктивную критику и стёб

Офлайн

#4 Янв. 31, 2014 12:08:55

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

геттеры и сеттеры или @property

Ну я один фиг не понял в чём вопрос. Вы сами поняли, для чего используется property?

Офлайн

#5 Янв. 31, 2014 12:43:17

Tropick
Зарегистрирован: 2014-01-31
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

На сколько я понимаю, property возвращает объект - копию входящего с реализацией getter setter deletter методами….поправьте если не так!

Офлайн

#6 Янв. 31, 2014 13:14:19

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

геттеры и сеттеры или @property

Я имел ввиду, есть ли у вас понимание того, где и когда это удобно применять, а где и нафиг не нужно? Ведь просто знать, что это и как работает- мало. Контроль атрибутов, выполнение каких-либо дополнительных действий при изменении/присвоении/удалении атрибута, вот малая часть возможностей такой реализации

Офлайн

#7 Янв. 31, 2014 13:26:45

Tropick
Зарегистрирован: 2014-01-31
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

Боюсь что такого понимания у меня пока нет. Прошу разъяснить, если не трудно. Безусловно, мне не очень нравиться что можно добавлять новые свойства объекту вне класса, но пока не очень понятно в каких случаях на это нужно забить.

Офлайн

#8 Янв. 31, 2014 14:40:27

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

геттеры и сеттеры или @property

Вот например у вас есть некий класс, отвечающий за интерфейс. Вы хотите чтобы при изменении размера шрифта сразу же перерисовывался интерфейс, и чтоб контролировать этот размер, а то вдруг какой-нибудь бестолковый программист подаст туда некорректное значение.

class Draw(object):
    def __init__(self):
         self.__font_size = 20
    @property
    def font_size(self):
        return self.__font_size
    @font_size.setter
    def font_size(self, size):
        if not isinstance(size, int) or 10 > size > 30:
            print("Пошёл нафиг!")
            return
        self.__font_size = size
        # Какой-то код, перерисовывающий инерфейс
        # в соответствии с новым размером шрифта

Отредактировано dimy44 (Янв. 31, 2014 14:45:42)

Офлайн

#9 Янв. 31, 2014 14:58:34

Tropick
Зарегистрирован: 2014-01-31
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

спасибо огромное!

Офлайн

#10 Янв. 31, 2014 19:04:20

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

геттеры и сеттеры или @property

property, по сути, реализуются гетерами и сетерами.
Вы же не думаете, что property - это ключевое слово питона? - Ничего подобного.
Это декоратор, который Вы вполне можете повторить самостоятельно, даже не зная, что он существует из коробки. Именно гетерами и сетерами дескрипторов это и реализуется.
Вот эквивалент property на питоне

class Property(object):
    "Emulate PyProperty_Type() in Objects/descrobject.c"
    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        if doc is None and fget is not None:
            doc = fget.__doc__
        self.__doc__ = doc
    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        if self.fget is None:
            raise AttributeError("unreadable attribute")
        return self.fget(obj)
    def __set__(self, obj, value):
        if self.fset is None:
            raise AttributeError("can't set attribute")
        self.fset(obj, value)
    def __delete__(self, obj):
        if self.fdel is None:
            raise AttributeError("can't delete attribute")
        self.fdel(obj)
    def getter(self, fget):
        return type(self)(fget, self.fset, self.fdel, self.__doc__)
    def setter(self, fset):
        return type(self)(self.fget, fset, self.fdel, self.__doc__)
    def deleter(self, fdel):
        return type(self)(self.fget, self.fset, fdel, self.__doc__)



Отредактировано FishHook (Янв. 31, 2014 19:22:25)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version