Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 22.12.2020
Сообщений: 29

Наследование классов Python. Не получается исправить ошибки

09.05.2023, 13:19. Показов 887. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Я составила код по типу Наследования, который выводит данные связанные с платежем. Мне сказали, что у меня идёт имеется несколько ошибок:
1) в методе add_payment, где я ожидаю получить список (list) и если передано что-то другое, то присваивается полю пустой список []
2) в строках 136 и 143 я передаю объекты производных классов.
3) не осуществляется вывод данных при выполнении метода print_payments_by_date

Помогите, пожалуйста, исправить данные ошибки, а то я не понимаю. что от меня требуют.


Вот код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
from abc import ABC, abstractmethod
 
# Создаем базовый класс Payment
class Payment(ABC):
    def __init__(self, date = None, amount = 0):
        self._date = date
        self._amount = amount
 
    # Определяем абстрактный метод
    @abstractmethod
    def payment_type(self):
        pass
 
    def my_name(self):
        # Возвращает название класса
        return self.__class__.__name__
 
    def __str__(self):
        # Возвращает строку с информацией о платеже
        return f"Дата: {self._date}, Платеж: {self._amount}"
 
# Создаем класс BankTransfer, наследуемый от класса Payment
class BankTransfer(Payment):
    def __init__(self, date, amount, correspondent_bank):
        super().__init__(date, amount)
        self._correspondent_bank = correspondent_bank
 
    # Перегружаем абстрактный метод
    def payment_type(self):
        return "Bank Transfer"
 
    def __str__(self):
        # Возвращает строку с информацией о переводе
        return f"Тип платежа: {self.payment_type()}, Банк-корреспондент: {self._correspondent_bank}, {super().__str__()}"
 
# Создаем класс WebMoney, наследуемый от класса Payment
class WebMoney(Payment):
    def __init__(self, date, amount, commission):
        super().__init__(date, amount)
        self._commission = commission
 
    # Перегружаем абстрактный метод
    def payment_type(self):
        return "WebMoney"
 
    def __str__(self):
        # Возвращает строку с информацией о переводе
        return f"Тип платежа: {self.payment_type()}, Коммиссия: {self._commission}, {super().__str__()}"
 
# Создаем класс Sales
class Sales():
    def __init__(self):
        self._payments = []
 
    # Метод для добавления платежа в список
    def add_payment(self, payment):
        if isinstance(payment, list):
            self._payments.append(payment)
        else:
            self._payments = []
 
 
    # Метод для вывода списка платежей на заданную дату
    def print_payments_by_date(self, date):
        for payment in self._payments:
            if str(payment._date) == str(date):
                print(payment)
 
    # Метод для вывода списка платежей в заданном диапазоне
    def print_payments_by_amount_range(self, min_amount, max_amount):
        for payment in self._payments:
            if int(min_amount) <= payment._amount <= int(max_amount):
                print(payment)
 
    # Метод для вывода статистической сводки
    def print_payments_summary(self):
        # Создаем словарь, где ключ - тип платежа, значение - список платежей данного типа
        payment_type_dict = {}
        for payment in self._payments:
            payment_type = payment.payment_type()
            if payment_type not in payment_type_dict:
                payment_type_dict[payment_type] = [payment]
            else:
                payment_type_dict[payment_type].append(payment)
 
        # Выводим статистику по каждому типу платежа
        for payment_type, payment_list in payment_type_dict.items():
            total_payments = len(payment_list)
            total_amount = sum(payment._amount for payment in payment_list)
            percent = round(total_payments / len(self._payments) * 100, 2)
            print(f"{payment_type} - Общая сумма платежей: {total_payments}, Процент: {percent}%, Общая сумма: {total_amount}")
 
    # Заполняем список экземпляров из текстового файла
    def read_file(self):
        with open("payments.txt", "r") as file:
            for line in file:
                payment_info = line.strip().split(",")
                payment_type = payment_info[0]
                date = str(payment_info[1])
                amount = int(payment_info[2])
 
                if payment_type == "Bank Transfer":
                    correspondent_bank = str(payment_info[3])
                    payment = BankTransfer(date, amount, correspondent_bank)
                elif payment_type == "Web Money":
                    commission = int(payment_info[3])
                    payment = WebMoney(date, amount, commission)
                    
                self._payments.append(payment)
        print(self._payments)
 
    # Выводим данные в файл
    def writh_file(self, name_file):
        with open(name_file, "w") as file:
            print(str(self._payments))
            for payment in self._payments:
                file.write(f"{payment.payment_type()},{payment._date},{payment._amount}")
                if isinstance(payment, BankTransfer):
                    file.write(f",{payment._correspondent_bank}")
                elif isinstance(payment, WebMoney):
                    file.write(f",{payment._commission}")
                file.write("\n")
 
 
# Создаем экземпляр класса Sales
sales = Sales()
 
# Добавляем несколько экземпляров классов BankTransfer и WebMoney в список
j = input('Ввести данные с клавиатуры? Y/Д ')
if j in 'YyДд':
    j = int(input('Сколько будет списков в платеже BankTransfer? '))
    for i in range(j):
        n1 = input("Введите дату платежа: ")
        n2 = int(input("Ведите платеж: "))
        n3 = input("Введите банк-корреспондент: ")
        sales.add_payment(BankTransfer(str(n1), n2, str(n3)))
    
    j = int(input('Сколько будет списков в платеже WebMoney? '))
    for i in range(j):
        n1 = input("Введите дату платежа: ")
        n2 = int(input("Ведите платеж: "))
        n3 = input("Введите комиссию: ")
        sales.add_payment(WebMoney(str(n1), n2, n3))
else:
    sales.read_file()
 
 
# Выводим список платежей на заданную дату
z = input("\nПо какой дате искать платеж? ")
print("Платежи по", z  ,": ")
sales.print_payments_by_date(z)
 
 
# Выводим список платежей в заданном диапазоне
print("\nВ каком диапазоне искать платеж? ")
z1 = input("Начало диапазона: ")
z2 = input("Конец диапазона: ")
print("Платежи в диапазоне", z1, "-", z2, ": ")
sales.print_payments_by_amount_range(z1, z2)
 
 
# Выводим статистическую сводку
print("\nСводка платежей:")
sales.print_payments_summary()
 
 
sales.writh_file("output.txt")

Данные в текстовом файле ("payments.txt"), которые экспортируем в код:
Bank Transfer,2022-01-01,5000,Bank A
Web Money,2022-01-02,3000,150
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.05.2023, 13:19
Ответы с готовыми решениями:

Наследование шаблонных классов: найти причины возникновения ошибки в коде и исправить эту ошибку
подскажите почему появляется такая ошибка error C2248: 'Base&lt;int,float&gt;::value1' : cannot access protected member declared in class...

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h (inline) #pragma once class list...

Наследование классов, ошибки при компиляции
У меня проблемы программы возникают при компиляции. Я читаю, что использование спецификатора protected позволяет видеть поля,...

3
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,307
09.05.2023, 18:49
Цитата Сообщение от Logini Посмотреть сообщение
1) в методе add_payment, где я ожидаю получить список (list) и если передано что-то другое, то присваивается полю пустой список []
2) в строках 136 и 143 я передаю объекты производных классов.
3) не осуществляется вывод данных при выполнении метода print_payments_by_date
Для полной картины не хватает тех. задания, а что нужно?
0
0 / 0 / 0
Регистрация: 22.12.2020
Сообщений: 29
09.05.2023, 19:00  [ТС]
Цитата Сообщение от kazak Посмотреть сообщение
Для полной картины не хватает тех. задания, а что нужно?
Основное задание:
Создать базовый класс Payment, включающий дату и сумму платежа.На его основе реализовать классы BankTransfer (Банковский перевод, включающий банк-корреспондент) и WebMoney (Служба WebMoney, включающая размер комиссии).
Наряду с общими полями и методами, каждый класс должен содержать и специфичные для него поля. Для списка экземпляров этих классов предусмотреть возможность:
-вывода списка платежей на заданную дату;
-вывода списка платежей,у которых величина платежа лежит в заданном диапазоне;
-вывода статистической сводки по каждому типу платежа (сколько было платежей, их доля,общая денежная сумма для платежей данного типа).
Создать класс Sales, содержащий список экземпляров этих классов. Написать демонстрационную программу, в которой будут использоваться все методы классов.

Уточнения к заданию:
1) В основной программе создать список и заполнить его экземплярами всех классов-наследников. Реализовать вывод списков
2) Заполнять список экземпляров из текстового файла, выводить данные также в файл.
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,307
14.05.2023, 13:11
Лучший ответ Сообщение было отмечено zss как решение

Решение

Цитата Сообщение от Logini Посмотреть сообщение
1) в методе add_payment, где я ожидаю получить список (list) и если передано что-то другое, то присваивается полю пустой список []
Цитата Сообщение от Logini Посмотреть сообщение
Python
1
2
3
4
5
def add_payment(self, payment):
   if isinstance(payment, list):
       self._payments.append(payment)
   else:
       self._payments = []
Не врут чертяки
Начнем с того, что append добавляет элемент в список, а так как у нас payment в этом случае тоже список, то в результате получится список в списке, но подозреваю, по условию задачи требуется все элементы payment добавить в self._payments, тогда нужно использовать метод extend.
Ну и второе, если payment не список, но требуется добавление единичных экземпляров класса, то делаем проверку на принадлежность к классу и тут уже используем append.
Python
1
2
3
4
5
def add_payment(self, payment):
   if isinstance(payment, list):
       self._payments.extend(payment)
   elif isinstance(payment, Payment):
       self._payments.append(payment)
Цитата Сообщение от Logini Посмотреть сообщение
2) в строках 136 и 143 я передаю объекты производных классов.
Цитата Сообщение от Logini Посмотреть сообщение
1) В основной программе создать список и заполнить его экземплярами всех классов-наследников. Реализовать вывод списков
Тут трудно сказать что именно имели в виду авторы, восможно нужно сначала создать отдельно обычные списки, заполнить их экземплярами классов, потом уже эти списки толкать в Sales

Цитата Сообщение от Logini Посмотреть сообщение
3) не осуществляется вывод данных при выполнении метода print_payments_by_date
Тут во-первых играет роль ваш вариант add_payment, при добавлении единичного экземпляра, он фактически не сохранится, и соответственно ничего будет выводить, а при добавлении списка вообще получите ошибку.
Воторой момент в print_payments_by_date идет строковое сравнение дат, тут так же результат будет зависить от формата введенной даты, одна опечатка и в ответ пустота.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2023, 13:11
Помогаю со студенческими работами здесь

Объясните как работает наследование классов в Python
Изучаю по книге Доусона, дошло до классов, но там объясняется так, что я не понимаю, слишком поверхностно объясняет, а именно в чем...

Наследование и полиморфизм: найти и исправить ошибки в коде
Возникла проблема с наследованием и полиморфизмом. В общем, в программе есть суперкласс Unit. Его наследует потомки Ball и Player. В свою...

Исправить ошибки присвоения классов bootstrap
&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;link data-require=&quot;bootstrap@*&quot; data-semver=&quot;3.3.6&quot; rel=&quot;stylesheet&quot; href=&quot;bootstrap&quot; /&gt; ...

Не получается исправить ошибки
Не получается исправить ошибки Локальная переменная или параметр с именем &quot;args&quot; нельзя объявить в данной области, так как...

не получается исправить ошибки...
Вот код, unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru