Bir nesne örneği python içinde iç içe geçmiş nesne örneklerinin listesini seri hale getirme

0

Soru

Giriş yapmanıza veya bir restoran oluşturmanıza izin verecek bir uygulama yapıyorum. Bir restoran sahibi olarak buzdolabı ekleyebilir/kaldırabilir/düzenleyebilirsiniz. Nihai hedefim, bir JSON dosyasına yazacağım Restoranların bir listesine sahip olmam ve uygulamayı her yeniden çalıştırdığımda bu verileri çekip "restoran sahibi olmayı" simüle edebilmem ve buzdolaplarını düzenleyebilmem. seçilen restoran için.

Aslında bunu istiyorum:

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

Aşağıdaki iki sınıfım var (ilgili yöntemleri gösteriyorum):


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)

Benim sorunum bunu JSON için seri hale getirmektir. Restoran nesnesini json'a seri hale getirmek için aşağıdakilerin çalıştığını, ancak iç içe geçmiş buzdolabı nesnelerini değil, aşağıdakileri buldum :

data = {
    'restaurants': []
}

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

Python'da nispeten yeniyim ve bir js arka planından geliyorum, bu yüzden hala sözdizimine aşina oluyorum. Sorum şu, buzdolaplarının iç listesini nasıl seri hale getirebilirim?

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

En iyi cevabı

0

Öncelikle, Python'daki sınıflarla çalışma görevini basitleştirecekleri için veri sınıflarını kontrol etmenizi öneririm. Veri sınıflarıyla, aşağıdaki gibi dunder yöntemlerini tanımlamanıza gerek yoktur __init__ ve __repr__ varsayılan olarak otomatik olarak oluşturulacakları gibi.

Özel kullanım durumunuz için, iç içe geçmiş bir sınıf modelini seri hale getirerek sorunu çözebilirsiniz. dict İsteğe bağlı kullanarak / JSON dizesi default geçebileceğiniz çağrılabilir json.dumps. Örneğin, aşağıdaki gibi bir lambda (aslında bir steno işlevi olan) iletebilirsiniz lambda o: o.__dict__ bu alan __dict__ aşağıda gösterildiği gibi, doğal olarak Json'a seri hale getirilemeyen nesneler için öznitelik.

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"}]}

Ancak veri sınıflarının da bir yardımcı işlev sağladığını unutmayınasdict bir dataclass örneğini bir dataclass örneğine dönüştürmeniz gerekiyorsa dict önce örnek.


Bununla birlikte, daha gelişmiş bir kullanım durumunuz varsa-örneğin, JSON verilerini iç içe geçmiş bir sınıf modeline serileştirme veya aşağıdaki gibi bir veri sınıfı alanını eşleme password gibi başka bir JSON anahtarına pw listelenen örnekte olduğu gibi-yukarıdaki gibi iç içe geçmiş bir veri sınıfı modeliyle iyi çalışan veri sınıfı sihirbazı gibi bir seri hale getirme kitaplığını kontrol etmenizi öneririm.

2021-11-24 05:02:30

Diğer dillerde

Bu sayfa diğer dillerde

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