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()之后的]
,这不是问题所在