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!
Posted
by