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也有一个很好的想法。
答案 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
删除它们并且它有效。所以这是看的方向。