Wpis z mikrobloga

Siema Mirki, jestem nowy w Pythonie i mam pytanie odnośnie dobrych praktyk.
Jeżeli obiekty łączy hierarchia, typu:

a = [b_1 = [c_11, c_12], b_2 = [c_21]]
i każdemu poziomowi odpowiada inna klasa obiektów, to czy złym rozwiązaniem będzie, jeżeli każdy z tych obiektów będzie zawierał identyczny slot, powiedzmy odwołanie do tej samej bazy danych.
Przykładowo w __init__ dla b_1 pojawi się self.db = connection, gdzie connection = a.db ?

Ta lista powyżej jest tylko uproszczeniem/wyobrażeniem. Tak naprawdę nie tworzę obiektu a, zawierającego w slotach wszystkie obiekty niższego stopnia. Informacje o obiektach oraz wiele innych parametrów siedzą sobie w bazie danych , a w Pythonie ad hoc ładuję sobie tylko ich uproszczoną reprezentację. Metody obiektów wykonują operacje, których wynik również jest logowany w tej samej bazie.

a = A() # init a
A.add('b_1', ...) # rejestruje b_1 w bazie danych i wykonuje jakąś operację
b_1 = a.get('b_1) # init b_1, po prostu wyciąga b_1 z bazy danych
b_1.run() # znowu jakaś operacja na bazie danych

#python #programowanie
  • 6
@grajlord: Nawet jakbyś potrzebował mieć wiele baz danych to tak się tego nie załatwia. Po co obiektowi wiedza w jakiej bazie danych leży? Model powinien być niezależny od fizycznego rozmieszczenia.
Po co obiektowi wiedza w jakiej bazie danych leży?


@piotrb: Bo jego metody wykonują operacje logowane do bazy danych lub tworzą obiekty potomne, które pozostają w hierarchicznej relacji z tym obiektem, i informacje o nich również są przechowywane w bazie danych.

Jak w takim razie podejść do tematu? Są jakieś wskazówki/tutoriale/praktyki, jak powinno wyglądać tworzenie takich zmiennych?
@piotrb: PS. poza tym z bazą danych jest to tylko przykład, a nie istota problemu, o który pytam. Inny przykład - obiekty mają również property (własność?) w postaci połączenia ssh, które jest współdzielone między "rodzicem" i obiektami potomymi.
Wydaje mi się, że jednak to jest normalna praktyka, skoro. np. obiekt klasy Cursor stworzony
przez sqlite3.connection().cursor() zawiera w sobie property connection, klasy Connection, które go stworzyło.
Wydaje mi się, że jednak to jest normalna praktyka, skoro. np. obiekt klasy Cursor stworzony

przez sqlite3.connection().cursor() zawiera w sobie property connection, klasy Connection, które go stworzyło.


@grajlord: Bo ten obiekt służy do wykonywania operacji na bazie danych.

A teraz odpowiedź do głównego zagadnienia:
Czy masz narzuconą strukturę bazy? Bo jeśli nie to czy rodzic może być dzieckiem? Bo jeśli nie, to struktura powinna się składać z dwóch tabel: główna, z
@piotrb: rodzic nie może być dzieckiem. Nie mam narzuconej struktury, ale zrobiłem właśnie taką jak piszesz, tzn. dwie tabele (potem będzie jeszcze 3, bo będzie też "dziecko dziecka"), w każdej pola, które odpowiadają parametrom używanym przy inicjalizacji klasy.
@piotrb: A odnośnie moich obiektów, to wydawało mi się sensowne wrzucenie połączenia do sqlite jako ich atrybutu. Bo jaką mam alternatywę - każdorazowo przy wywoływaniu różnych metod danej instancji, podawać połączenie jako argument. Ale jaki miałoby sens podanie jako argumentu ścieżki do innej bazy, skoro nie jest w niej jeszcze zdefiniowana, nie ma tam jej childów, ani zalogowanych dotychczasowych efektów działania.