[python] SQLObject - úprava parametr? p?i vytvá?ení t?ídy

Jaroslav Aster orm na humlak.cz
Úterý Říjen 28 16:46:11 CET 2008


Ahoj,

Jan Jakubuv píše v Pá 24. 10. 2008 v 10:38 +0100:
> zdravim,
> 
> nemam zkusenosti primo s SQLObject, ale zkusim hadat. Nepomohla by
> metoda "__new__"? "__new__" se vola pred "__init__" pro vytvoreni
> samotne instance tridy. Viz dokumentace :
> http://docs.python.org/reference/datamodel.html#basic-customization

metodu __new__ znám a zkoušel jsem ji, ale bez úspěchu. Z dokumentace a
z vlastních pokusů mám pocit, že nejde v __new__ změnit parametry, které
se předají __init__. Alespoň já jsem nepřišel na to jak to udělat.

Zjistil jsem, že to co jsem napsal o SQLObjectu nebyla tak úplně pravda.
SQLObject metodu __init__ používá. SQLObject pracuje ve dvou režimech

1, vytváření nového objektu
2, vytvoření objektu z databáze

V prvním režimu funguje definování vlastního __init__, tak jak psal
rejcze.

V druhém režimu předává SQLObject __initu__ jeden keyword argument
_SO_fetch_no_create=1, proto když má metoda __init__ poziční argumenty,
tak se vyvolá vyjímka, protože při vytváření objektu z databáze se žádný
poziční argument nezadá.

Řešením by mohlo být toto

def __init__(self, *args, **kwgs):
	if not kwgs.has_key("_SO_fetch_no_create"):
	 	...
	SQLObject.__init__(self, **kwgs)

nebo kontrolovat jestli jsou nějaké poziční argumenty zadány, ale v obou
případech je to spoléhání na interní implementaci SQLObjectu, což není
správné. Taky náročnost implemtance by byla vetší než používání keyword
argumentů, proto jsem se rozhodl se na to vykašlat :-).

Děkuji všem, kteří mi odpověděli na můj dotaz, za pomoc.

> 2008/10/24 Jaroslav Aster <orm na humlak.cz>:
> > Ahoj,
> >
> > rajcze píše v Pá 24. 10. 2008 v 09:05 +0200:
> >> class MojeTrida(SQLObject):
> >>     def __init__(self, x):
> >>        #tady muzes delat co chces pred inicializaci SQLObjectu
> >>        SQLObject.__init__(self)
> >>
> >>
> >> snad jsem dobre pochopil, co potrebujes
> >
> > děkuji za odpověď, ale jak jsem psal definování vlastní metody __init__ nepomůže,
> > protože SQLObject používá funkci __init__ jen při prvotním vytvoření objektu. Pokud
> > je objekt načten z databáze, tak se metoda __init__ nepoužívá.
> >
> >
> >> 2008/10/23 Jaroslav Aster <orm na humlak.cz>:
> >> > Ahoj,
> >> >
> >> > narazil jsem na takový, spíše estetický problém, který se mi prozatím
> >> > nepodařilo vyřešit. Pokud definuji nějakou třídu a dědím od třídy
> >> > SQLObject, tak při vytváření objektu z mnou definované třídy nemohu
> >> > použít poziční parametry. Uvedu na příkladu.
> >> >
> >> > class MojeTrida(SQLObject):
> >> >        x = IntCol()
> >> >
> >> > # spravne
> >> > MojeTrida(x=1)
> >> >
> >> > # spatne
> >> > MojeTrida(1)
> >> >
> >> > Definování medoty __init__ u třídy MojeTrida nepomůže, protože
> >> > SQLObject, protože SQLObject tam dělá nějakou "magii". Potřeboval bych
> >> > paramety upravit ještě před zavoláním __init__. Neměl by někdo nějaký
> >> > nápad?
> >> >
> >> > --
> >> > Jaroslav Aster <orm na humlak.cz>
> >> >
> >> > _______________________________________________
> >> > Python mailing list
> >> > Python na py.cz
> >> > http://www.py.cz/mailman/listinfo/python
> >> >
> >>
> >>
> >>
> > --
> > Jaroslav Aster <orm na humlak.cz>
> >
> > _______________________________________________
> > Python mailing list
> > Python na py.cz
> > http://www.py.cz/mailman/listinfo/python
> >
> >
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
-- 
Jaroslav Aster <orm na humlak.cz>



Další informace o konferenci Python