A descriptorok

A descriptorok (leírók) szintén a kedvenc python nyelvi eszközeim közé tartoznak. Teljes boldogságban élhetünk akkor is, ha fogalmunk sincs róluk, de bizonyos helyeken meg tudja szépíteni a programunkat. A dekorátorokhoz hasonlóan nem túl bonyolult dologról van szó, ha valaki használt már Djangót, akkor jó eséllyel találkozott velük, még ha nem is tud a létezésükről.

Djangóban a model mezői általában az adatbázis mezőnek megfeleltethető python típusok:

>>> from pages.models import Page
>>> p = Page()
>>> p.creation_date
datetime.datetime(2010, 8, 31, 10, 7, 30, 909404)
>>> type(p.creation_date)
<type 'datetime.datetime'>

Általában... nézzünk csak meg azonban egy ForeignKey típusú mezőt - ha nem rendelek hozzá értéket, akkor látszik a turpisság:

>>> p.author
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/django/db/models/fields/related.py", line 288, in __get__
    raise self.field.rel.to.DoesNotExist
DoesNotExist

Hmm, milyen __get__? Nezzük csak meg jobban, mi is a author mező:

>>> p.__class__.__dict__['author']
<django.db.models.fields.related.ReverseSingleRelatedObjectDescriptor object at 0x25a9710>
>>> dir(p.__class__.__dict__['author'])
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__',
 '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
 '__set__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'field']

És igen, megvan a tettes, aki nem egy sima mező, hanem egy descriptor, akinek már van __get__ (és esetünkben __set__) metódusa is. Na lássuk akkor mik is azok a descriptorok!

Tovább…

01szept.
5