Нужна помощь в решении задачи через классы

Yuras

Новичок
Пользователь
Мар 9, 2022
1
0
1
1. Система - Windows
2. Python 3.10
Доброго времени суток. пытаюсь решить при помощи классов задачу, условие приложена ниже. уже перебрал кучу вариантов, потому хотелось бы чтоб показали правильное решение или Ваше видение данной реализации. На сейчас у меня основная проблема - вывести значения из базы при наложении фильтров.
Вопросы на текущий момент:
1) архитектурно у меня идет правильная реализация? или как бы лучше было это реализовать
2) write_data - добавляет объект экземпляра data в объект класса Database. соответственно его не получается итерировать, (по крайне мере при моей реализации)
3) реализация фильтра через класс Criteriy - нормальная? или есть решение гораздо более простое и удобное?
4) как тогда правильнее будет осуществлять проверку фильтра в базе данных метод - read_data. ( я предполагал dict1.items() <= dict2.items() - в таком ключе)
Очень буду рад развернутому ответу, так как учусь, а спросить негде...



Python:
"""Организуйте архитектуру приложения “База данных” (псевдо).
В роли базы данных у вас будет класс Database,
который будет хранить данные в виде переменной списка.
Класс Database должен иметь методы read_data(criteria), write_data(element).
Для элемента данных напишите класс Data. В данном случае мы будем хранить
данные о пользователях.
Data будет иметь атрибуты: country, name, age, gender, height, weight.
В классе Database метод read_data будет принимать на вход аргумент criteria,
который является словарем вида {“age”: 25}, после чего метод вернет
отдельный список всех элементов у которых данное условие истино."""


class Criteriy:
    """Класс описываюшй фильтр"""
    # def __init__(self, **kwargs):
    #     #print(kwargs)
    #     self.__dict__ = kwargs
    dic = {}

    def __init__(self, **kwargs):
        # print(kwargs)
        self.dic = kwargs

    def __str__(self):
        return f"{self.dic}"

#  Добавление фильтра
dict_ = {'age': 33}
criteria = Criteriy(**dict_)
#print(criteria)

class Data:
    """Класс описываюшй объект базы данных"""
    def __init__(self, country, name, age, gender, height, weight):
        self.country = country
        self.name = name
        self.age = age
        self.gender = gender
        self.height = height
        self.weight = weight

    def __repr__(self):
        return f" country = {self.country}, name = {self.name}, " \
            f"age = {self.age}, gender={self.gender}, height={self.height}," \
               f"weight = {self.weight}"


class Database:
    """Класс описываюшй базу данных"""
    # _my_data = []
    def __init__(self, data=[]):
        self._my_data = data

    def __str__(self):
        return self._my_data

    def get_my_data(self):
        return self._my_data


    def read_data(self, criteria):
        """Наложение фильтра и вывод информации"""
        a = iter(self._my_data)
        print(self._my_data)
        # print(criteria.dic, type(criteria.dic) )

        # for key in self.get_my_data:
        #     print('1')
        #     if criteria.dic in key:
        #     # next(a)
        #         print(key, type(key))
        while True:
            try:
                key = next(a)
                # temp = list(key)
                print(key, type(key))
                # if criteria.dic in key:
                #     print('333')
            except StopIteration:
                break


    def write_data(self, element):
        """Добавление объекта в базу данных"""
        print(type(element))
        self._my_data.append(element)


#  Создаем 3 экземпляка классса Data
data1 = Data('Ukraine', 'Yura', 33, 'm', 183, 85)
data2 = Data('Ukraine', 'Ira', 30, 'f', 163, 55)
data3 = Data('Ukraine', 'Yura2', 33, 'm', 183, 85)

#  Создаем экземпляка классса Database
my_base = Database()

#  Добавляем наши объекты в базу данных
my_base.write_data(data1)
my_base.write_data(data2)
my_base.write_data(data3)

#  Пытаемся считать наш параметр и вывести искомые значения
print('Финальный вызов: ', my_base.read_data(criteria))
# print(my_base.get_my_data())
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 672
478
83
ну первое что бросилось в глаза, в задании нет ни слова про класс Criteriy, а он у вас есть...
 

Selez

Новичок
Пользователь
Мар 11, 2022
11
3
3
Python:
from dataclasses import asdict, dataclass
from typing import Any, Dict, List

dataset = [
    ['Ukraine', 'Yura', 33, 'm', 183, 85],
    ['Ukraine', 'Ira', 30, 'f', 163, 55],
    ['Ukraine', 'Yura2', 33, 'm', 183, 85],
]


@dataclass
class Data:
    country: str
    name: str
    age: int
    gender: str
    height: int
    weight: int


class Database:
    """Класс имитирующий работу базы данных"""

    data = []

    def read_data(self, criteria: dict) -> List[Dict[str, Any]]:
        """Считывает данные из списка по поисковому критерию"""
        find_data = []

        for key, val in criteria.items():
            for user in self.data:
                if user[key] == val:
                    find_data.append(user)
            break
        return find_data

    def write_data(self, user: Data) -> None:
        """Записывает данные в псевдо базу"""
        # TODO в идеале реализовать проверку
        # на уникальность данных но для
        # псевдобазы мне показалось это излишним
        self.data.append(
            asdict(
                user,
            ),
        )


db = Database()
for user in dataset:
    db.write_data(Data(*user))


print(db.read_data({'age': 33, 'gender': 'm'}))
 

Форум IT Специалистов