2012-03-08 59 views
1
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] 

繼反彈是我的類定義:Python變量不適合循環

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有一個公平的想法。

回答

4

問題是,的確,你的java過去了! :)

的錯誤是在這裏:

_fields = {} 

_fields是一個類的成員!因此,Employee的每個實例共享相同的_fields var,並且無論何時修改它,都會修改所有其他對象。 必須在_fields = {}部分移入__init__功能:

self._fields={} 

但是,你會遇到另一個問題:self.eid = xx調用__setattr__方法! (以及self._fields!)

當您需要訪問實例的'_fields'成員而不是self._fields時,解決方案是使用self.__dict__['_fields']。它將直接訪問該成員,而不是通過__getattr__和一個無限遞歸,最後堆棧溢出。

+0

對!日Thnx。有沒有一種方法可以解決__setattr__方法問題。重點是我想維護動態添加到實例的屬性的列表或字典。 – 2012-03-08 09:09:08

+0

是的,確實如此。檢查以下URL(舊版本,但仍然適用):http://docs.python.org/release/2.5.2/ref/attribute-access.html。這意味着你必須使用self .__ dict __ ['_ fields']而不是self._fields。 – huelbois 2012-03-08 09:51:09

0

其功能的副作用:

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

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

刪除它們和它的作品。所以這是看的方向。