Python动态对象创建

时间:2015-02-22 18:32:25

标签: python

我尝试使用列表和/或词典来存储我创建的对象,但我的尝试失败了。

使用列表或字典的原因是让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

3 个答案:

答案 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你做错了两件事。

  • 1)缩进很糟糕,因此Employee类的方法不在类中。
  • 2)您没有将对象存储在任何地方。

我建议你这样做:

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)