我声明了一个类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
?
如何在地图中应用会员功能?
答案 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