2014-01-11 58 views
4

我在python中創建了一個非常簡單的容器對象,它的一個函數需要創建一個臨時的空佔位符類,它除了告訴程序要刪除什麼之外什麼也不做。創建另一個對象的實例的Python錯誤

class __cyclepass(object): 
    "Null class as a placeholder for deleting items in a cycle.""" 
    pass 

class Cycle(object): 

    def __init__(self, *args): 
     self.l = list(args) 

    #......................... 

    def __delitem__(self, key): 
     """Magic method for deleting items via indexing.""" 
     try: 
      if isinstance(key, slice): 
       s = key.start; e = key.stop; stp = key.step if key.step else 1 
       slicelen = abs((s - e) // stp) 
       if slicelen == 1: 
        steps = [s] 
       else: 
        steps = [s + stp * i for i in range(slicelen)] 
       _list = copy(self.l) 
       for step in steps: 
        index = step % len(self) 
        _list[index] = __cyclepass() #this is where an error occurs 
       self.l = list(filter(lambda x: x.__class__ != __cyclepass, _list)) 
      else: 
       index = key % len(self) 
       del self.l[index] 
     except: 
      raise IndexError("Bad index %s" % str(key)) 

一切似乎罰款(雖然有點亂,但也就是拋開點),但在運行程序和隱式調用delitem方法在我得到這個錯誤:

NameError: global name '_Cycle__cyclepass' is not defined 

什麼在創建__cyclepass對象時,在地球上會導致它尋找_Cycle__cyclepass

+4

這是python的名字「私人」成員的結果。將雙下劃線前綴重命名爲單下劃線,並解決問題。 – shx2

+0

好吧,我改變了它,並確實一切都是固定的,謝謝你的幫助!爲什麼python會這樣做,並且可以在任何實際意義上使用它? – user3002473

+1

@ shx2你爲什麼不把它作爲答案發布? :) – aIKid

回答

5

[我的評論移動到答案,如建議]

這是「私人」的成員Python的name mangling的結果。將雙下劃線前綴重命名爲單下劃線,並解決問題。

相關問題