Serializing zoznam objektov prípadoch vnorené do objektu stupňa python

0

Otázka

Robím aplikáciu, ktorá by vám buď prihláste sa alebo vytvorte reštaurácia. Ako majiteľ reštaurácie, môžete pridať/odstrániť/upraviť chladničky. Môj koniec cieľom je, aby som si zoznam Reštaurácií, ktoré by som písať do JSON súboru a kedykoľvek som znova spustiť aplikáciu, môžem vytiahnuť, že údaje v a simulovať "to, že majiteľa reštaurácie," a upraviť chladničky pre zvolený reštaurácia.

Som v podstate chcem toto:

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

Mám tieto dve triedy(zobrazuje relevantné metódy):


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 problém je v serializing to pre JSON. Zistil som, že takto pracuje na zoradenie reštaurácia objekt JSON, ale nie vnorené chladnička objektov :

data = {
    'restaurants': []
}

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

Som relatívne nový python, a pochádzam z js pozadí, takže som stále spoznávania syntax. Moja otázka je, ako sa mám serialize vnútorné zoznam chladničky?

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

Najlepšiu odpoveď

0

Po prvé, ja by som navrhnúť mimo kontrolu dataclasses , ako budú zjednodušiť úlohu pracovať s tried v jazyku Python. S dataclasses, nemusíte definovať dunder metódy, ako je __init__ a __repr__ ako sa bude automaticky generované štandardne.

Pre váš konkrétny prípad použitia, môžete vyriešiť problém s serializing vnorenej triedy modelu na dict / JSON reťazec pomocou voliteľného default disponibilná, ktoré môžete odovzdať do json.dumps. Napríklad, môžete prejsť lambda (čo je v podstate skratka funkcia) ako lambda o: o.__dict__, ktorý načíta __dict__ atribút pre objekty, ktoré nie sú vo svojej podstate serializable na JSON, ako je uvedené nižšie.

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 všimnite si, že dataclasses tiež poskytuje pomocné funkcie asdict ak potrebujete previesť dataclass stupňa na dict stupňa prvý.


Aj keď, ak máte viac rozšírené prípad použitia - napríklad, de-serializing JSON údaje vnorenej triedy modelu, alebo mapovanie dataclass oblasti, ako je password k ďalším JSON kľúč ako pw ako v uvedený príklad, tak by som navrhnúť odhlasovanie mód knižnice ako dataclass-sprievodcu, ktorý dobre spolupracuje s vnorené dataclass model, ako je uvedené vyššie.

2021-11-24 05:02:30

V iných jazykoch

Táto stránka je v iných jazykoch

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