Найти - Пользователи
Полная версия: геттеры и сеттеры или @property
Начало » Python для новичков » геттеры и сеттеры или @property
1 2 3
Tropick
Доброго времени суток господа!!!
Совсем не давно начал курить 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
dimy44
Причём здесь тролли?
Tropick
В том смысле, что принимаю конструктивную критику и стёб
dimy44
Ну я один фиг не понял в чём вопрос. Вы сами поняли, для чего используется property?
Tropick
На сколько я понимаю, property возвращает объект - копию входящего с реализацией getter setter deletter методами….поправьте если не так!
dimy44
Я имел ввиду, есть ли у вас понимание того, где и когда это удобно применять, а где и нафиг не нужно? Ведь просто знать, что это и как работает- мало. Контроль атрибутов, выполнение каких-либо дополнительных действий при изменении/присвоении/удалении атрибута, вот малая часть возможностей такой реализации
Tropick
Боюсь что такого понимания у меня пока нет. Прошу разъяснить, если не трудно. Безусловно, мне не очень нравиться что можно добавлять новые свойства объекту вне класса, но пока не очень понятно в каких случаях на это нужно забить.
dimy44
Вот например у вас есть некий класс, отвечающий за интерфейс. Вы хотите чтобы при изменении размера шрифта сразу же перерисовывался интерфейс, и чтоб контролировать этот размер, а то вдруг какой-нибудь бестолковый программист подаст туда некорректное значение.
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
        # Какой-то код, перерисовывающий инерфейс
        # в соответствии с новым размером шрифта
Tropick
спасибо огромное!
FishHook
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__)
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