Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
96 / 19 / 13
Регистрация: 27.02.2018
Сообщений: 60
1

Класс: Создайте класс, осуществляющий подсчет и изменение числа книг.

26.03.2018, 20:44. Показов 5803. Ответов 6
Метки нет (Все метки)

Привет форумчане. Задачу решил, и даже проверку проходит , но код не нравится. Подскажите как можно было решить более правильно и в каком месте. ПС когда смотрю туториалы, читаю про ООП, разбитаю чужую задачу вроде все понятно, а как самому написать, возникают траблы. Да и так как я решил , не вижу вообще зачем тут нужно ООП(В плане приемущества решения данной парадигмой).

Вот задача:
Создайте класс, осуществляющий подсчет и изменение числа книг. Названия книг, их количество считываются одной строкой вида 'Boogeyman 66 Battleground 50', число книг - произвольное.
В классе должен быть реализован конструктор, деструктор, методы просмотра числа, взятия и возвращения книг.
Реализовать вывод начальных значений, взятие по 1 книге, возвращение по 1 книге с выводом текущего числа после вызова каждого из методов, меняющих значение книг.
Типичный ответ одной строкой: 'Boogeyman 66 65 66 Battleground 50 49 50'.

Пример входных данных:
Boogeyman 66 Battleground 50

Пример выходных данных:
Boogeyman 66 65 66 Battleground 50 49 50

Вот код:
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
# coding=utf-8
 
 
class Books(object):
 
    def __init__(self):
        pass
 
    def __del__(self):
        pass
 
    def display_book(self, book):
        self.book = book
        return self.book
 
    def take_one_book(self, book):
        self.book = book - 1
        return self.book
    def put_one_book(self, book):
        self.book = book + 1
        return self.book
 
 
a = Books()
 
new_list = list(input().split())
 
for i in new_list:
    if i.isalpha():
        print(i, end=" ")
    if i.isdigit():
        print(a.display_book(int(i)), end=" ")
        print(a.take_one_book(a.display_book(int(i))), end=" ")
        print(a.put_one_book(a.take_one_book(a.display_book(int(i)))), end=" ")
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2018, 20:44
Ответы с готовыми решениями:

Создайте класс для обработки имеющихся данных
Здравствуйте. Уважаемы формучане, помогите подалуйста с задачей по классам. Помогите...

Создать класс библиотека , который возвращает количество книг с одинаковым названием
Написать в питоне:создать класс библиотека , который возвращает количество книг с одинаковым...

Создайте класс RightTriangle и Создайте производный класс Rectangle
Создайте класс RightTriangle (Прямоугольный треугольник), задаваемый катетами и опишите механизм...

Создайте класс Parallelogram. Этот класс хранит декартовы координаты четырех углов параллелограмма
Создайте класс Parallelogram.Этот класс хранит декартовы координаты четырех углов параллелограмма....

6
393 / 121 / 48
Регистрация: 26.10.2013
Сообщений: 734
26.03.2018, 21:35 2
А я вот вообще не понял задачу) И решения тоже не понимаю)

26 строка, нет смысла преобразовывать результат .split() в list() потому что split всегда вернет list.

13, 17, 20 строки, нет смысла хранить в классе свойство book так как оно каждый раз перезаписывается, а вот число на которое ты увеличиваешь или уменьшаешь входные данные в методах take_* и put_* лучше вынести в константу класса.

Также из-за того что ты везде в методах класса назвал входной аргумент book совершенно непонятно какой тип дынных в него передавать.

Когда переопределяешь методы супер-класса то вместо pass вызывай метод супер-класса, если ты конечно хочешь что бы он выполнился.

И по идее можно было все 3 твоих метода класса объединить в один __getattr__(self, attr)
1
96 / 19 / 13
Регистрация: 27.02.2018
Сообщений: 60
26.03.2018, 21:42  [ТС] 3
Цитата Сообщение от Wi0M Посмотреть сообщение
26 строка, нет смысла преобразовывать результат .split() в list() потому что split всегда вернет list.
13, 17, 20 строки, нет смысла хранить в классе свойство book так как оно каждый раз перезаписывается, а вот число на которое ты увеличиваешь или уменьшаешь входные данные в методах take_* и put_* лучше вынести в константу класса.
Также из-за того что ты везде в методах класса назвал входной аргумент book совершенно непонятно какой тип дынных в него передавать.
Когда переопределяешь методы супер-класса то вместо pass вызывай метод супер-класса, если ты конечно хочешь что бы он выполнился.
И по идее можно было все 3 твоих метода класса объединить в один __getattr__(self, attr)
Спасибо, учту когда буду переделывать.
0
151 / 102 / 33
Регистрация: 11.08.2016
Сообщений: 574
26.03.2018, 22:55 4
Цитата Сообщение от Zarelix Посмотреть сообщение
конструктор, деструктор, методы просмотра числа, взятия и возвращения книг.
1. конструктор у Вас не реализован (логично ему опциоанально передать какой-то начальный список)
2. деструктор. ммм... в питоне в таком классе он не имеет смысла, в детали сборщика мусора здесь вдаваться не место
3. «класс, осуществляющий подсчет и изменение числа книг». КНИГ а не конкретной КНИГИ. А в данной реализации Ваш класс это просто избыточная обертка к числовой переменной, не реализующая никакой дополнительной логики и не предоставляющая ожидаемый уровень абстракции.

Ну и наконец, задание Ваше не особо хорошо сформулировано. я бы даже сказал – отвратительно сформулировано. Ничего толком не понятно.

Добавлено через 56 минут
если привести задачу к более-менее логичному виду, то ее решением будет простой подкласс dict, в котором надо будет реализовать:

а) дополнительный способ инициализации из строки вида «name0 count0 name1 count1 …» примерно таким образом:

l=text.split()
zip(l[::2], [int(n) for n in l[1::2]]) # даст [('name0', count0), ('name1', count1), ('name2', count2)], это годно для конструктора dict()


б) методы инкремента и декремента типа def take1(self, name): self[name] -= 1 и def put1(self, name): self[name] += 1
1
Просто Лис
Эксперт Python
4407 / 2804 / 929
Регистрация: 17.05.2012
Сообщений: 8,190
Записей в блоге: 9
27.03.2018, 06:08 5
В первую очередь, когда создаешь класс, ты должен подумать:

1) а какие поля будут у класса?
2) их названия.
3) их типы (строка, целое, float, список, словарь итд)
4) видимость (public, protected, private). (В питоне, пример: self.books, self._books, self.__books).

А питоне принято объявлять все поля в инициализаторе (в __init__)

Python
1
2
3
4
5
6
class Books(object):
    def __init__(self):
        self._books = {}  # инициализируем поле пустым словарём
 
    def __del__(self):
        self._books = {}  # затираем поле пустым значением
1
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 5
03.04.2020, 14:24 6
тоже этот курс прохожу тихонько
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
class Library(object):
    def __init__(self):
        self.books = {}
 
    def __del__(self):
        self.books = {}
 
    def get_quantity(self, book):
        print(self.books[book], end=' ')
 
    def get_book(self, book):
        self.books[book] -= 1
        print(self.books[book], end=' ')
 
    def return_book(self, book):
        self.books[book] += 1
        print(self.books[book], end=' ')
 
 
a = Library()
books_init = input().split()
 
for i in range(0, len(books_init), 2):
    a.books[books_init[i]] = int(books_init[i + 1])
 
for book in a.books:
    print(book, end=' ')
    a.get_quantity(book)
    a.get_book(book)
    a.return_book(book)
0
0 / 0 / 0
Регистрация: 09.09.2021
Сообщений: 1
09.09.2021, 18:37 7
Ужасно составлено и сформулировано задание.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Book:
    def __init__(self,stroka):
        date = stroka.split()
        self.__kol = dict(zip(date[::2],[int(i) for i in date[1::2]]))
 
    def __del__(self):
        pass
 
    def getval(self, namebook):
        return self.__kol[namebook]
 
    def takebook(self,namebook,val):
        self.__kol[namebook] = self.__kol[namebook] - int(val)
        return self.__kol[namebook]
 
    def addbook(self, namebook, val):
        self.__kol[namebook] = self.__kol[namebook] + int(val)
        return self.__kol[namebook]
 
date_book = 'Boogeyman 66 Battleground 50'
a = Book(date_book)
for book in date_book.split()[::2]:
    print(book,a.getval(book),a.takebook(book,1), a.addbook(book,1))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2021, 18:37

С++ класс (создайте класс с именем Complex для выполнения в арифмитических операий с комплексными числами))
Кто сможет помогите пожалуйста! (Класс Complex). Создайте класс с именем Complex для выполнения...

Создайте класс Date. Добавить в строковый класс функцию
3)Создайте класс Date, который будет содержать информацию о дате (день, месяц, год). С помощью...

Создайте класс, в котором есть ostream& operator<<. Класс должен содержать очередь с приоритетом
Создайте класс, в котором есть ostream&amp; operator&lt;&lt;. Класс должен содержать очередь с приоритетом....

Создайте класс, описывающий и реализующий класс-наследник класса "прямоугольник"
создайте класс описывающий и реализующий класс-наследник класса object геометрическую фигуру ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.