我尝试使用列表和/或词典来存储我创建的对象,但我的尝试失败了。
使用列表或字典的原因是让python保留对该对象的引用,以防止垃圾收集组件丢弃我们的对象。我的问题似乎更多的是对象本身的初始化,以及命名对象。
我的脚本从数据库中获取数据,然后自动为列表中的每个项目创建对象,在我们的例子中是员工。
这是我的班级:
class Employee:
empCount = 0
def __init__(self, employee_id, name, age):
self.employee_id = employee_id
self.name = name
self.age = age
Employee.empCount += 1
def display_employee_count(self):
print("Total Employee %d" % Employee.empCount)
def display_employee(self):
print("Employee ID : ", self.employee_id,
" First name : ", self.name,
' Age : ', self.age)
我知道创建一个我会调用的对象
joe1883 = Employee('joe1883', 'Joe', 21)
要显示对象属性,我会
joe1883.display_employee()
产生:
Employee ID : joe1883 First name : Joe Age : 21
我的问题是,我如何通过循环来做到这一点?
# Data set has, employee id, first name, and age
my_list = [['joe1883', 'joe', 21],
['bob1492', 'bob', 22],
['frank1889','frank',34]]
for names in my_list:
employee_id = names[0]
name = names[1]
age = names[2]
#print("Employee ID : " + employee_id + " First name : " + name + ' Age : ' + str(age))
# This is the line that creates my error !
employee_id = Employee(employee_id, name, age)
如果我将此行插入循环语句
employee_id = Employee(employee_id, name, age)
然后致电
joe1883 = Employee('joe1883', 'Joe', 21)
我得到#NameError: name 'joe1883' is not defined
。
答案 0 :(得分:1)
你需要保持对一个对象的引用,这不仅是因为它不是垃圾收集,而是你可以引用它。引用可以是给它一个变量名,比如joe1883
,或者可以通过将对象存储在容器中,如列表或字典。
如果将其放在列表中,列表中的每个元素都可以使用整数索引引用,例如employees [42]。要在这样的容器中查找员工,您需要按索引搜索所有这些员工,直到找到所需的那个。
如果您想快速找到一名员工,他们应该将其存储在字典中,然后您可以执行employees['joe1883']
之类的操作直接访问其中一个。
由于您不知道容器类型,Employee
实例将被放入,如果有的话,在课堂上保留empCount
毫无意义。如果你把一堆它们放在一个列表或字典中,并且需要知道多少,你可以通过在容器对象上使用内置的len()
函数来找到它,即len(employee_list)
或{ {1}}。
len(employee_dict)
答案 1 :(得分:0)
如果我正确理解了您的问题,那么您正在尝试根据列表创建一组对象 - 员工,其中包含每个对象的参数。
我稍微修改/简化了你的代码,这很好用:
class Employee:
empCount = 0
def __init__(self, employee_id, name, age):
self.employee_id = employee_id
self.name = name
self.age = age
Employee.empCount += 1
def display_employee_count(self):
print("Total Employee %d" % Employee.empCount)
def display_employee(self):
print("Employee ID : {0} First name : {1} Age : {2}".format(self.employee_id, self.name,self.age))
my_list = [('joe1883', 'joe', 21), ('bob1492', 'bob', 22), ('frank1889', 'frank', 34)] # in this format arguments will be easier to pass as parameters to your class constructor
list_of_employees = [] # list where you can put created objects
for emp in my_list:
list_of_employees.append(Employee(*emp)) # now you just pass your tuple of arguments like that
for emp in list_of_employees: #looping through the list with objects you created and printing results
emp.display_employee()
答案 2 :(得分:0)
@eduard你做错了两件事。
我建议你这样做:
employ_dic={}
class Employee:
def __init__(self, employee_id, name, age):
self.employee_id = employee_id
self.name = name
self.age = age
employ_dic[employee_id]=self
def display_employee(self):
print '''Employee ID: {0}, First Name: {1}, Age: {2}'''.format(self.employee_id, self.name, self.age)
lists = [['joe1883', 'joe', 21],['bob1492', 'bob', 22],['frank1889','frank',34]]
for list in lists:
employee_id = Employee(list[0], list[1], list[2])
employ_dic['joe1883'].display_employee()
# to display the count:
print len(employ_dic)