为什么关键功能可以调用属性?但是我无法在控制台中直接调用该属性?

时间:2017-06-22 14:59:25

标签: python key

完整的代码来自DEAP包的示例:

https://github.com/DEAP/deap/blob/0ef6c40b4ba24dbbf1591bd97b08857a1fe3376a/examples/ga/onemax.pyHere

我做了一个测试,人口和个人的大小都是5,我输入以下语句:

>>>MAX=max(pop,key=attrgetter("fitness"))
>>>[1,1,1,1,1]

我理解这返回了pop.fitness的最大值,但是,为什么我不能直接将其称为:

>>>pop.fitness

并发生错误:

Traceback (most recent call last):

  File "<ipython-input-74-b9dde7c090eb>", line 1, in <module>
    pop.fitness

AttributeError: 'list' object has no attribute 'fitness'

为什么无法调用pop.fitness

1 个答案:

答案 0 :(得分:0)

poplist / iterable。列表本身没有属性fitness。该列表包含每个都具有属性fitness的对象。 attrgetter('fitness')创建一个函数,该函数在使用对象调用时返回该对象的fitness属性。 max使用此函数从列表中获取它应该排序的值。

我不知道您的列表中包含的内容是什么,但它是这样的:

>>> pop
[Thing(fitness=1), Thing(fitness=2), ...]

这两个是等价的:

>>> pop[0].fitness
1
>>> attrgetter('fitness')(pop[0])
1

max(pop, key=attrgetter('fitness'))正在采取以下措施:

for thing in pop:
    thing.fitness  # here be magic using this property as sorting criterion