Szeregowania listy obiektów, zagnieżdżonych w instancji obiektu pythona

0

Pytanie

Tworzę aplikację, która pozwoli ci zalogować się lub utworzyć restauracja. Jako właściciel restauracji, można dodawać/usuwać/edytować lodówki. Moim ostatecznym celem jest, aby miał listę restauracji, które ja bym się zapisał do pliku JSON, i w każdej chwili, gdy restartuję aplikacja, mogę dostać te dane i naśladować "być właścicielem restauracji" i edytować lodówki do wybranej restauracji.

Ja, w rzeczywistości, chcę tego:

data = {
    restaurants: [
        {
            restaurant: {
            name: "Peppy",
            pw: "123",
            fridges: [
                {
                    fridge: {
                        owner: restaurant.name,
                        contents: []
                    }
                }
            ]
        }
        }
    ]
}

Mam dwa następujące klasy(z podaniem odpowiednich metod):


class Restaurant:
    def __init__(self, owner, password):
        self.__password = password
        self.owner = owner
        self.__owned_fridges = [] # list of owned fridges

    def add_fridge(self):
        nickname = input("What would you like to name the fridge: ")
        self.__owned_fridges.append(fr(self.owner, nickname))
        print("Fridge added!")
 

class Fridge:
    def __init__(self, owner, nickname):
        self.nickname = nickname
        self.owner = owner
        self.__authorized_users = [owner]
        self.__contents = []

    def add_to_fridge(self):
        if len(self.__contents) == 5:
            print("Your fridge is full!")
        else:
            item = input("What would you like to add : ")
            self.__contents.append(item)

Mój problem polega na serializacji dla JSON. Odkryłem, że następujący działa dla serializacji obiektu restauracji w JSON, ale nie zagnieżdżonych obiektów lodówki :

data = {
    'restaurants': []
}

# Testing code
test = res("Jac", "350b534")
test.add_fridge()
test.add_fridge()
data['restaurants'].append(json.dumps(test.__dict__))

Jestem stosunkowo nowy w pythonie, i mam doświadczenie w pracy w js, więc ciągle poznaję ze składnią. Moje pytanie brzmi, jak mi serializować wewnętrzny lista lodówek?

json oop python
2021-11-24 03:41:22
1

Najlepsza odpowiedź

0

Po pierwsze, ja bym proponował sprawdzić klas danych, ponieważ są one ułatwiają zadanie w pracy z klasami w Pythonie. Z pomocą dataclasses nie musisz określić bardziej zaawansowane techniki, takie jak __init__ i __repr__ tak jak domyślnie będą generowane automatycznie.

Dla danego przypadku użycia można rozwiązać problem z сериализацией modelu załącznika klasy w dict / Ciąg znaków JSON za pomocą opcjonalnego default docelowy, który można przekazać w json.dumps. Na przykład, możesz przekazać лямбду (która w istocie jest jedynie funkcją), takie jak lambda o: o.__dict__, która pobiera __dict__ atrybut dla obiektów, które w swej istocie nie są serializowane w JSON, jak pokazano poniżej.

from __future__ import annotations

import json
from dataclasses import dataclass


@dataclass
class A:
    my_string: str
    b: list[B]


@dataclass
class B:
    my_int: int
    password: str


a = A('test', [B(2, '123'), B(5, '321')])
print(a)
# A(my_string='test', b=[B(my_int=2, password='123'), B(my_int=5, password='321')])

print(json.dumps(a, default=lambda o: o.__dict__))
# {"my_string": "test", "b": [{"my_int": 2, "password": "123"}, {"my_int": 5, "password": "321"}]}

Ale należy pamiętać, że dataclasses oferuje również funkcję pomocnicząasdict jeśli potrzebujesz, aby konwertować instancję klasy danych w dict przykład pierwszy.


Jednak, jeśli masz bardziej zaawansowany wariant wykorzystania - na przykład, podczas deserializacji danych JSON w zagnieżdżonej model klasy lub mapowanie pola klasy danych, np. password do kolejnej wskazówki JSON, takiego jak pw jak w powyższym przykładzie - ja bym proponował sprawdzić biblioteki serializacji, takie jak kreator klas danych, która działa dobrze z załączonego modelem klas danych, jak określono powyżej.

2021-11-24 05:02:30

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................