4

我对编程很陌生,并试图自学。我目前正在尝试学习如何从类构建对象,我认为我理解。我当前的任务是将对象添加到列表中并打印该列表。最终,我正在尝试构建一个程序,该程序创建一个对象并列出已在编号列表中创建的每个对象,即:

1 - tomato, red
2 - corn, yellow
etc...

因此,首先,我只是尝试构建它的基本部分。这是我做的:

# Builds objects on instantiation for a vegetable and color
class Veg:
    def __init__(self, name, color):
        self.name = name
        self.color = color
        print('You have created a new', self.color, self.name, end='.\n')

# Function to create a new vegetable and store it in a list
def createVeg():
    name = input('What is the name of the Vegetable? ')
    color = input('What color is the vegetable? ')
    Veg(name, color)
    vegList.append(Veg)
    return

# Initialize variables
vegList = []
choice = 'y'

# Main loop
while choice == 'y':
    print('Your basket contains:\n', vegList)
    choice = input('Would you like to add a new vegetable? (y / n) ')
    if choice == 'y':
        createVeg()
    if choice == 'n':
        break

print('Goodbye!')

当我运行它时,我得到以下信息:

Your basket contains:
 []
Would you like to add a new vegetable? (y / n) y
What is the name of the Vegetable? tomato
What color is the vegetable? red
You have created a new red tomato.
Your basket contains:
 [<class '__main__.Veg'>]
Would you like to add a new vegetable? (y / n) y
What is the name of the Vegetable? corn
What color is the vegetable? yellow
You have created a new yellow corn.
Your basket contains:
 [<class '__main__.Veg'>, <class '__main__.Veg'>]
Would you like to add a new vegetable? (y / n) n
Goodbye!

因此,据我所知,除了打印列表之外,一切正常,我无法弄清楚。它似乎在附加列表属性,但不显示对象。我也尝试了一个“for”循环,但得到了相同的结果。

4

3 回答 3

6

这一切都按设计工作。该<class '__main__.Veg'>字符串是您的类实例的表示形式。Veg

__repr__您可以通过给您的类一个方法来自定义该表示:

class Veg:
    # ....

    def __repr__(self):
        return 'Veg({!r}, {!r})'.format(self.name, self.color)

__repr__函数所要做的就是返回一个合适的字符串。

使用上面的示例__repr__函数,您的列表将改为:

[Veg('tomato', 'red'), Veg('corn', 'yellow')]

您确实需要确保您确实附加了新实例。代替:

Veg(name, color)
vegList.append(Veg)

做这个:

newveg = Veg(name, color)
vegList.append(newveg)
于 2013-03-14T14:40:34.943 回答
2

问题出在线路上

Veg(name, color)
vegList.append(Veg)

您在这里所做的是创建一个新的 Veg,但不为它分配任何东西。然后,您将 Veg类型附加到列表中。此外,您需要通过将方法添加到您的类来告诉 Python 如何以Veg人类可读的方式打印您的对象。__str__最后,如果您直接打印一个列表 ( print vegList),您将获得列表内容的机器可读表示,这不是您想要的。迭代列表的元素并直接打印它们将起作用。

这是具有必要更改的工作版本:

# Builds objects on instantiation for a vegetable and color
class Veg:
    def __init__(self, name, color):
        self.name = name
        self.color = color
        print('You have created a new', self.color, self.name, end='.\n')

    def __str__(self):
        return 'One {} {}'.format(self.color, self.name)

# Function to create a new vegetable and store it in a list
def createVeg():
    name = input('What is the name of the Vegetable? ')
    color = input('What color is the vegetable? ')

    vegList.append(Veg(name, color))
    return

# Initialize variables
vegList = []
choice = 'y'

# Main loop
while choice == 'y':
    print('Your basket contains:\n')
    for veg in vegList:
        print(veg)
    choice = input('Would you like to add a new vegetable? (y / n) ')
    if choice == 'y':
        createVeg()
    if choice == 'n':
        break

print('Goodbye!')
于 2013-03-14T15:04:01.800 回答
1

你的问题在这里:

def createVeg():
    name = input('What is the name of the Vegetable? ')
    color = input('What color is the vegetable? ')
    Veg(name, color) # 1
    vegList.append(Veg) # 2
    return

我注释为 #1 的行创建了一个 veg 对象的新实例。但是,它对它没有任何作用。它不会将它存储在任何地方,或者命名它,就像你写的一样a = Veg(name, color)。基本上,它创建对象,然后忘记它。

我注释为 #2 的行然后将 Veg CLASS 附加到列表中,而不是该类的实例。这就像将整数的概念添加到列表中,而不是添加实际的整数 5。

尝试将这两行替换为...

v = Veg(name, color)
vegList.append(v)

完成此操作后,您仍然需要按照 Martijn Pieters 的回答来正确打印对象。

于 2013-03-14T15:02:17.293 回答