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)问题是,当我打印is时,它包含10乘以9...即
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]似乎相同的emp变量正在被覆盖。我不确定出了什么问题。虽然我是一名Java程序员,但我认为我对Python也有一个很好的了解。
发布于 2012-03-08 17:03:07
实际上,问题出在您的java过去!:)
错误在这里:
_fields = {}_fields是类成员!因此,Employee的每个实例共享相同的_fields变量,当您修改一个实例时,就会修改所有其他对象。您必须将_fields = {}部件移动到__init__函数中:
self._fields={}但是,您将遇到另一个问题:self.eid = xx调用__setattr__方法!( self._fields也是如此!)
解决方案是,当您需要访问实例的“_fields”成员而不是self._fields时,可以使用self.__dict__['_fields']。它将直接访问成员,而不是通过__getattr__和无限递归,最终会有一个很好的堆栈溢出。
发布于 2012-03-08 16:58:48
这是函数的副作用:
def __getattr__(self, name):
return self._fields.get(name)
def __setattr__(self,name,value):
self._fields[name] = value去掉它们,它就可以工作了。所以这就是我们要看的方向。
https://stackoverflow.com/questions/9614795
复制相似问题