категории | RSS

Warning: Python!
Правда, посторонним вход не запрещён.
|
Питонщикам сайта посвящается.
|
Тема статьи: Учимся использовать property.
|
|
План статьи:
|
|--§1- Введение
|--§2- Всё остальное
|--§3- На посошок
|
§1: Введение
Как известно большему числу питонщиков, читающих эту статью, в Python 2.2, а значит и в нашем ненаглядном PyS60, помимо всего прочего были добавлены "новые" классы и несколько очень классных возможностей, напрямую опирающихся на эти самые классы.
Итак что же нужно, чтобы класс считался "новым"?
Для этого он должен наследовать от нового (корневого) класса object. Вот собственно и всё, что нужно.
Сами property базируются на механизме дескрипторов (descriptor protocol), также являющимся одним из новшеств.
Сама суть property довольно проста.
Их можно использовать для создания дескриптора, вызывающего различные функции при доступе к атрибуту "нового" класса:

property(fget=None, fset=None, fdel=None, doc=None) -> property attribute

fget -- функция(или любой вызываемый объект), которая будет вызываться при взятии значения атрибута(если атрибут не поле(переменная), а метод, то вместо вызова метода будет вызвана fget),
fset -- функция, которая будет вызываться при установке значения атрибута(для методов этот параметр не задаётся),
fdel -- функция, которая будет вызываться при удалении атрибута,
doc -- строка документации property.
|
Особо следует оговорить, что не нужно лепить в эти параметры всё что ни попадя. Это -- bad style coding, а по нашему - быдлокодинг.
То есть fget должен возвращать хоть какое-то значение, fset и fdel также должны работать как и положено, а doc должен быть строкой документации.
|
Сейчас я поясню, как эти фичи можно использовать.
|
§2: Всё остальное
|
Хрестоматийный пример:

class C(object):
    def getx(self): return self.__x
    def setx(self, value): self.__x = value
    def delx(self): del self.__x
    x = property(getx, setx, delx, "I'm the 'x' property.")

c = C()

Обратите внимание, после запуска этого кода у экземпляра б в c.x ничего нет:
>>> c.x
Traceback (most recent call last):
  File "<console>", line 1, in ?
  File "E:\Projects\How to use property.py", line 6, in getx
    def getx(self): return self.__x
AttributeError: 'C' object has no attribute '_C__x'
>>>

Для этого нужно внести туда какое-либо значение.
Примеры использования property можно посмотреть в стандартном модуле topwindow.
|
А вот так можно создать константу:
class Constants(object):
    __x = 1
    def getx(self): return self.__x
    x = property(getx) # константа

const = Constants()
print const.x
const.x = 2 # AttributeError: can't set attribute

Теперь, если вы не доглядите, и какой-нибудь участок кода непредусмотренным вами образом захочет изменить значение const.x, это не пройдет незамеченным.
Конечно, в таком мощном языке, как Python, это можно было сделать и раньше, и сейчас другими способами, но так кратко и изящно -- нет.
|
§3: На посошок
Надеюсь вам понравилось.

Источник новости: dimonvideo.ru

Virtuos86
2010-01-09T13:12:10Z
Здесь находятся
всего 0. За сутки здесь было 0 человек

Комментарии 4

#4   Deftrue    

Да про сглаживание кривых гораздо интереснее же)


0 ответить

#4   Virtuos86    

Я не знаю какое отношение статья об особенностях объектной модели python\'а имеет к алгоритму разложения отрезка в растр со сглаживанием(согласно яндексу).
Если бы знал, то может и написал бы.


0 ответить

#4   Deftrue    

Лучше бы рассказал как рисовать кривые первого и второго порядка по алгоритму Ву


0 ответить

#4   Virtuos86    

Небольшое уточнение: символы подчеркивания в коде это именно символы подчеркивания, а не попытка имитировать пробелы-отступы.


0 ответить

Яндекс.Метрика