1

考虑一个对象列表和一个适用于一个对象的方法:

beers = []
beers.append(Beer('Carlsberg', 'tasty'))
beers.append(Beer('Guinness', 'bitter'))
beers.append(Beer('Leffe', 'perfect'))

def howIsBeer (name):
    taste = ???
    print taste

Class Beer:
    def __init__ (self, name, taste):
        self.name = name
        self.taste = taste

howIsBeer()如果仅提供啤酒名称,该方法将如何获得啤酒的味道?我的第一个倾向是迭代beers列表,但作为 Python,我怀疑有更直接的方法。有没有?

4

3 回答 3

3

实在想不出更好的方法,只需使用for-loop。

def howIsBeer(name):
    for beer in beers:
        if beer.name == name:
            return beer.taste

In [1]: howIsBeer("Carlsburg")
Out[1]: tasty

另请注意,该关键字class是用 small 编写的c。在使用它来创建实例之前,您还必须定义您的类。

编辑:正如评论中所建议的,一种方法是定义字典。如果你觉得它有用,你可以使用下面的代码。但是请注意,仅当您拥有大量 Beer 对象并且性能速度对您非常重要时,才建议这样。否则使用提供的第一个代码

class Beer:
    names = {}
    def __init__(self, name, taste):
        Beer.names[name] = self
        self.name = name
        self.taste = taste

In [3]: Beer.names["Carlsburg"].taste
Out[3]: tasty
于 2012-12-04T12:55:12.210 回答
3

只需遍历列表并检查每一个。

你需要稍微移动一下代码,因为class def需要在类的使用之上,而且它还使用了一个小的c. 您还应该注意它未被识别的情况。

你也拼错了嘉士伯:/

class Beer:
    def __init__ (self, name, taste):
        self.name = name
        self.taste = taste



beers = []
beers.append(Beer('Carlsberg', 'tasty'))
beers.append(Beer('Guinness', 'bitter'))
beers.append(Beer('Lef', 'perfect'))


def howIsBeer (name):

    taste = "I have no idea"

    for beer in beers:
        if beer.name == name:
            taste = beer.taste

    print taste



howIsBeer("Carlsberg") # tasty

不过,我会这样做(使用此处的字典可以灵活地拥有多个属性):

beers = {}
beers["Lef"] = {"taste": "tasty"}
beers["Staropramen"] = {"taste": "tasty"}
beers["Peroni"] = {"taste": "tasty"}
beers["Coors Light"] = {"taste": "What is this?!"}


def howIsBeer (name):

    taste = "I have no idea"

    if name in beers:
        taste = beers[name]["taste"]

    print taste



howIsBeer("Lef")

如果你只是想存储口味,那么你可以这样做:

beers = {}
beers["Lef"] = "tasty"
beers["Staropramen"] = "tasty"
beers["Peroni"] = "tasty"
beers["Coors Light"] = "What is this?!"


def howIsBeer (name):

    taste = "I have no idea"

    if name in beers:
        taste = beers[name]

    print taste



howIsBeer("Lef")

如果您正在寻找存储一系列对象 - 正如您在问题中提到的那样 - 那么您需要一个对象字典 -而不是作为类变量的字典。

IE

beers = {}

def add_beer(beer):
    beers[beer.name] = beer

然后获取您正在查看的啤酒的数据;

if beer in beers:
    beers[beer].taste

这可以扩展到任何对象类型,我相信这正是您正在寻找的;

例如

cheeses = {}
add_cheese(cheese):
    cheeses[cheese.name] = cheese

在哪里

class cheese:
    def __init__(self, name, smelliness, hardness, colour, country):
        self.name = name
        self.smelliness = smelliness
        self.hardness = hardness
        self.colour = colour
        self.country = country
于 2012-12-04T12:59:10.310 回答
0

为了完整起见,我找到了一种使用类似Linq 的单行语句的方法,它还具有更易于阅读的优点:

taste = [b.taste for b in beers if b.name==name][0]

最后[0]是返回第一项,因为查询返回匹配项的列表。所以要获得整个列表:

[b.taste for b in beers if b.name==name]

这就是我喜欢 Python 的原因!

于 2013-07-21T08:45:15.607 回答