Modelujeme s deskriptorem

18. 8. 2014 19:48 (aktualizováno) Petr Blahoš

Cítím jistou potřebu napsat, jak celá věc s modelováním pokračuje, ikdyž teď v létě mám poněkud méně času, než jsem myslel. Tentokrát ani nebudu dávat odkaz na předchozí díl, jen připomenu o co se snažím: Udělat v Pythonu takovou datovou strukturu, která při změně vygeneruje událost. V Pythonu je ovšem problém odchytávat obecně přiřazení a změny hodnot v proměnných. Na nejvyšší úrovni (object_a.data = 382) to jde, ale jakmile udělám object_a.data = [1, 2, 3,], tak odchytit object_a.data[2] = 56 už není tak jednoduché. Proto jdu tou cestou, že povolím jen ty změny objektů, které mi tu detekovatelnost nenabourají. Tak jdeme na step07.

Konečně se dostávám do stavu, kdy se mi definice modelu líbí. Po vzoru SQLAlchemy declarative teď můžu psát:

class MyModel(HotContainer):
    article = HotProperty()
    sn = HotProperty()
    operations = HotTypedProperty(OperationList)
    process = HotTypedProperty(ProcessList)
HotProperty (a HotTypedProperty) je deskriptor, který zde nechci vysvětlovat, protože je vysvětlen jinde a lépe. Ve zkratce to znamená, že když si udělám instanci model = MyModel() a pak přiřazuju do article nebo z něj čtu, tak se volají funkce __set__ a __get__ třídy HotProperty, takže si s přiřazovanou hodnotou můžu udělat, co se mi zlíbí. Např. zkontrolovat, že je neměnná, nebo vystřelit událost. Ale taky se o ni musím kompletně postarat.

Deskriptory mi pomohou hlídat přiřazení na té nejvyšší úrovni – v rámci properties objektu. Pokud ale pracuji s listem (nebo jinou složitější strukturou), tak zůstávám u vpodstatě stejného HotListu, jak v předchozích dílech. Jen posílání eventů se poněkud změnilo.

A ještě jedna věc je zatím jinak. Zrušil jsem hierarchii. Teď mám HotContainer, který může obsahovat HotProperty, což může být primitivní typ nebo HotList nebo HotDict, ale tyto kontejnery už můžou obsahovat jen neměnné typy, takže to generování událostí se vždy děje na té první úrovni. Ještě nevím, jestli u toho zůstanu. Když se na to podívám sobecky, tak pro svoje účely rozhodně nepotřebuju žádné hlubší struktury. Na druhou, když to neudělám, budu mít pocit jistého dluhu.

Jestli se nemám zbytečně rozepisovat, tak to asi pro dnešek stačí. Mrkněte na production.py, ve kterém se změnila třída ProductModel tak, jak popisuju nahoře. Kromě toho to funguje stejně, jako v předchozích dílech. ProductModel je použit v příkladech view01.py a view03.py. Kromě toho dictsample.py obsahuje ukázku použití nového HotDict. Jako bonus, step07 funguje s pythonem 2.7 a 3.4. Jen pro verzi 3.4 budete muset někde sehnat wxPython neboli Phoenix.

Sdílet