Python-在映射中应用成员函数

Python-在映射中应用成员函数,python,dictionary,Python,Dictionary,我声明了一个类员工和一个由其组成的列表: 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, J

我声明了一个类
员工
和一个由其组成的列表:

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
name\u list=map(获取姓名、员工名单)
回溯(最近一次调用last):文件“ask.py”,第13行,在
姓名列表=映射(获取姓名、员工列表)
名称错误:未定义名称“get_name”
如何才能不定义
get\u name

如何在映射中应用成员函数?

映射(获取员工姓名列表)
在您的代码中等同于

[获取员工列表中员工的姓名(员工)]

[员工列表中员工的员工.获取员工姓名]

您应该在
Employee
类之外声明
get\u name
方法:

def get_name(employee):
    return employee.name
或者使用
Lambda
更简单的方法:


name\u list=map(lambda employee:employee.name,employee\u list)
您必须从实例调用该方法。您可以使用lambda进行此操作

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

这应该通过列表理解来完成:

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

此外,我还建议您缩短创建employee_列表的方式,不指定中间变量名,而是直接在列表文本中创建实例:

employee_list = [Employee("Tom"), Employee("Karl"), Employee("John")]
这可以通过再次使用列表来进一步缩短:

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

虽然所有其他答案都是正确的,但都忽略了python的一个特殊特性:“实例方法”可以以“类方法”的方式调用,将类实例作为第一个参数传递。因此(至少在python2.7中),以下操作非常有效:

map(Employee.get_name, employee_list)

有关其工作原因和方式的详细信息,请参阅。

map
调用函数,但
get\u name()
是一种方法。如果您确实想使用
map
,那么可以利用Python实现方法的方式:它们相当于以对象作为第一个
self
参数作为未绑定方法调用函数:

name_list = map(Employee.get_name, employee_list)
要在不将方法绑定到特定实例的情况下访问该方法,需要通过类进行访问。请注意,如果您有Employee的各种子类,并且覆盖了
get\u name
,那么这将无法正常工作

正如其他人所说,更具Pythonic风格的方法是使用列表理解,但是如果您想使用“Pythonic”,那么您根本不应该使用访问器方法:您应该只访问
name
属性以获得这样一个简单的值,或者如果需要更复杂的访问,则将其转换为属性:

names = [employee.name for employee in employee_list]

e.get_name()
,而不是
e.get_name
。员工列表中的员工在
[employee.get_name()]有一个打字错误]
:get_name()之后的
]
,这不是问题所在