Python变量不会在for循环中反弹

时间:2012-03-08 08:34:42

标签: python-2.7

employees = []
for i in range(0,10):

    emp = Employee(i)
    emp.first_name = "%s-%s"%("first name", i)
    emp.last_name = "%s-%s"%("last_name", i)
    emp.desgination = "%s-%s"%("engineer", i)

    employees.append(emp)


ids = [e.eid for e in employees]

以下是我的班级定义:

class Employee:

    _fields = {}

    def __init__(self, eid):
        self.eid = eid

    def __getattr__(self, name):
        return self._fields.get(name)

    def __setattr__(self,name,value):
        self._fields[name] = value

    def __str__(self):
        return str(self._fields)

    def __unicode__(self):
        return str(self._fields)

问题在于,当我打印id时,它包含10次9 ...即

[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

似乎正在覆盖相同的emp变量。我不确定出了什么问题。虽然我是一名Java程序员,但我认为我对Python也有一个很好的想法。

2 个答案:

答案 0 :(得分:4)

问题确实是你的java过去了! :)

错误在于:

_fields = {}

_fields是CLASS会员!因此,Employee的每个实例共享相同的_fields var,并且每当您修改一个var时,都会修改所有其他对象。 您必须将_fields = {}部分移至__init__函数:

self._fields={}

但是,你会遇到另一个问题:self.eid = xx调用__setattr__方法! (self._fields也是如此!)

解决方案是在需要访问实例的“_fields”成员而不是self.__dict__['_fields']时使用self._fields。它将直接访问成员,而不是通过__getattr__和无限递归,最后有一个很好的堆栈溢出。

答案 1 :(得分:0)

这是函数的副作用:

def __getattr__(self, name):
    return self._fields.get(name)

def __setattr__(self,name,value):
    self._fields[name] = value

删除它们并且它有效。所以这是看的方向。