Форум сайта python.su
0
Доброго времени суток господа!!!
Совсем не давно начал курить 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
Офлайн
0
В том смысле, что принимаю конструктивную критику и стёб
Офлайн
Ну я один фиг не понял в чём вопрос. Вы сами поняли, для чего используется property?
Офлайн
0
На сколько я понимаю, property возвращает объект - копию входящего с реализацией getter setter deletter методами….поправьте если не так!
Офлайн
Я имел ввиду, есть ли у вас понимание того, где и когда это удобно применять, а где и нафиг не нужно? Ведь просто знать, что это и как работает- мало. Контроль атрибутов, выполнение каких-либо дополнительных действий при изменении/присвоении/удалении атрибута, вот малая часть возможностей такой реализации
Офлайн
0
Боюсь что такого понимания у меня пока нет. Прошу разъяснить, если не трудно. Безусловно, мне не очень нравиться что можно добавлять новые свойства объекту вне класса, но пока не очень понятно в каких случаях на это нужно забить.
Офлайн
Вот например у вас есть некий класс, отвечающий за интерфейс. Вы хотите чтобы при изменении размера шрифта сразу же перерисовывался интерфейс, и чтоб контролировать этот размер, а то вдруг какой-нибудь бестолковый программист подаст туда некорректное значение.
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)
Офлайн
0
спасибо огромное!
Офлайн
568
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)
Офлайн