Entries tagged “haladó”

Metaprogramozás I

Bevezető

A metaclassok nyitják meg a teret a metaprogramozás előtt kedvelt nyelvünkben. Megértésükhöz szükséges néhány fogalmat és építőelemet tisztázni, mert nem a metaclassok a nehezek magukban, hanem az a több tucat pythonos építőkocka sok, amit össze kell gyűjteni. RePa dekorátorjaihoz és descriptorjaihoz hasonlóan semmi olyat nem tesznek lehetővé amit vagy a megszokott...

Tovább…

25szept.
0

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

Singleton

A weblaboron olvastam ma egy cikket inf3rno tollából, amely az ősosztályként megvalósított singleton problémáját járja körül PHP-ban. (Egyke tervezési minta, de én nem szeretem az ilyeneket lefordítani, mert nagyon suta tud lenni, szerintem.) Pythonban sem egyértelmű a dolog, a klasszikus "legyen privát a konstruktor, és egy metódus adja vissza a példányt" megoldás nem működik, mert pythonban a konstruktor mindig publikus. Ennek ellenére nem az okoz nehézséget, hogy hogyan valósítsuk meg a singletont, hanem hogy a lehetőségek közül melyiket válasszuk :)

Nézzünk néhány példát, a teljesség igénye nélkül! Nem kell megijedni, ha kezdőbb olvasók nem teljesen értik a példákat, megértésükhöz szükséges a python nyelv bizonyos szintű ismerete.

Tovább…

27júl.
5