Python - 在地图中应用成员函数

时间:2016-04-27 07:42:57

标签: python dictionary

我声明了一个类Employee,并且列表由它组成:

class Employee():
    def __init__(self, _name):
        self.name = _name
    def get_name(self):
        return self.name

Tom   = Employee("Tom")
Karl  = Employee("Karl")
John  = Employee("John")

employee_list = [Tom, Karl, John]

现在,我希望通过在地图中应用get_name来获取其名称列表:

name_list = map(get_name, employee_list)


Traceback (most recent call last): File "ask.py", line 13, in <module> 
    name_list = map(get_name, employee_list) 
NameError: name 'get_name' is not defined

如何定义get_name

如何在地图中应用会员功能?

5 个答案:

答案 0 :(得分:3)

代码中的

map(get_name, employee_list)等同于

[get_name(employee) for employee in employee_list]

不是[employee.get_name() for employee in employee_list]

您应该在get_name类之外声明Employee方法:

def get_name(employee):
    return employee.name

或使用Lambda的更简单方法:

name_list = map(lambda employee: employee.name, employee_list)

答案 1 :(得分:2)

您必须从实例调用该方法。您可以将lambda用于此

name_list = map(lambda e: e.get_name(), employee_list)

答案 2 :(得分:2)

这应该使用列表理解来完成:

names = [employee.get_name() for employee in employee_list]

此外,我建议您缩短创建employee_list的方式,也不要分配中间变量名,而是直接在列表文字中创建实例:

employee_list = [Employee("Tom"), Employee("Karl"), Employee("John")]

再次使用列表推导可以进一步缩短这一点:

employee_list = [Employee(name) for name in ("Tom", "Karl", "John")]

答案 3 :(得分:1)

虽然所有其他答案都是正确的,但都错过了python的一个特定功能:“实例方法”可以以“类方法”的方式调用,将类实例作为第一个参数传递。所以(至少在python2.7中),以下工作正常:

map(Employee.get_name, employee_list)

有关其原因和方式的详细信息,请参阅this SO question

答案 4 :(得分:0)

map调用函数,但get_name()是一种方法。如果你真的想使用map,那么你可以利用Python实现方法的方式:它们相当于将该函数作为未绑定方法调用,并将该对象作为第一个self参数:

name_list = map(Employee.get_name, employee_list)

要访问该方法而不将其绑定到您需要在类上访问的特定实例。请注意,如果您拥有各种Employee子类并且已覆盖get_name,则无法正常工作。

正如其他人所说,更像Pythonic的方式是使用列表理解,但如果你想要去'Pythonic'那么你根本不应该使用访问器方法:你应该只是访问{{ 1}}像这样的简单值的属性,或者如果您需要更复杂的访问权限,则将其转换为属性:

name