Создайте класс со списком как используемый объект - PullRequest
0 голосов
/ 20 февраля 2020

Я новичок в OOP и, таким образом, возможно, поступлю неправильно в Python. Я пытаюсь создать экземпляр класса со списком других объектов в качестве аргумента. Затем я хочу иметь возможность перебирать этот список, вызывая некоторый аргумент первого объекта. Проблема заключается в том, что когда я создаю экземпляр второго класса, аргумент списка сводится к одному объекту, то есть я не могу перебрать его. Это имеет смысл, но я не знаю, как обойти это.

Вот пример:

#create a class of Goods with attributes: description and price
class Goods:
    def __init__(self, desc, price):
        self.desc = desc
        self.price = price

#create a class of Shelf, which is a list of Goods
class Shelf:
    def __init__(self, stuff):
        self.stuff = stuff

#write a method for Shelf that prints just the descriptions of everything on the shelf (this is what won't work)
    def print_stuff_descriptions(self):
        return([self[i].desc for i in range(len(self))])

#create two Goods:
icecream = Goods('Icecream', 10)
butter = Goods('Butter', 5)

#now create a Shelf containing those two Goods
isle_1 = Shelf([icecream, butter])

#Now i try to use the method for printing descriptions
print(isle_1.print_stuff_descriptions())

Это выдает ошибку: TypeError: object of type 'Shelf' has no len(), которая имеет смысл как print(isle_1) дает: <__main__.Shelf object at 0x0124ECB0> то есть один объект без длины.

Я могу обойти это, выполнив следующее (вместо создания объекта Shelf):

#create a list of the Goods
isle_1 = [icecream, butter]

#create a list of the descriptions
isle_1_stuff_descriptions = [isle_1[i].desc for i in range(len(isle_1))]

#print the result
print(isle_1_stuff_descriptions)
['Icecream', 'Butter']

Это все делает смысл, но я хотел бы иметь возможность выполнять такие вещи, как условия выполнения на основе:

if 'Icecream' in isle_1.print_stuff_descriptions:

Вместо этого я должен создать переменную, а затем создать список описаний и затем выполнить условие на эту новую переменную.

if 'Icecream' in isle_1_stuff_descriptions:

Это кажется чрезвычайно громоздким и, как я думал, OOP должно было сделать более элегантным. Это способ сделать это, или есть способ сделать это в OOP?

1 Ответ

1 голос
/ 20 февраля 2020

Вы не используете self.stuff в print_stuff_descriptions. Это должно быть:

    def print_stuff_descriptions(self):
        return([self.stuff[i].desc for i in range(len(self.stuff))])

или более просто:

    def print_stuff_descriptions(self):
        return [x.desc for x in self.stuff]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...