2011-11-09 28 views
3

所以我一直得到這個錯誤,當我谷歌的時候,最常見的解決方法是確保一個類的所有方法都有'self'作爲第一個參數。以下是錯誤:如何解決未在Python中全局定義的'self'導入錯誤?

File "C:\Users\me\Documents\Project\code\model\TrainEvent.py", line 9, in NameError: global name 'self' is not definedPress any key to continue . . .

這似乎是與除我所有的方法簡單的修復一個常見的錯誤確實有自身作爲第一個參數。然後我意識到追溯只是指向聲明類名的那一行。它並沒有指向我用自己來調用方法的路線。這個錯誤在此之前就已經提出。事實上,它似乎是在進口時提出的。這裏是TrainEvent.py。

from xml.etree.ElementTree import Element 

    class TrainEvent(object): 

     def __init__(self, element): 
      self._element = element 
      self.MsgId = self.__tagGrab('MsgId') 
      self.MsgTime = self.__tagGrab('MsgTime') 
      self.Offset = self.__tagGrab('Offset') 
      self.TranId = self.__tagGrab('TranId') 
      self.Portal = self.__tagGrab('Portal') 
      moveElem = self._element.find('Move') 
      self.StartTime = self.__tagGrab('StartTime', moveElem) 
      self.EndTime = self.__tagGrab('EndTime', moveElem) 
      self.Type = self.__tagGrab('Type', moveElem) 
      carElem = self._element.find('Car') 
      self.Name = self.__tagGrab('Name', carElem) 
      self.UniqueId = self.__tagGrab('UniqueId', carElem) 
      self.Orientation = self.__tagGrab('Orientation', carElem) 
      self.Wells = self.__tagGrab('Wells', carElem) 
      self.Axles = self.__tagGrab('Axles', carElem) 
      self.Length = self.__tagGrab('Length', carElem) 
      self.IsEngine = self.__tagGrab('IsEngine', carElem) 
      self.IsGhost = self.__tagGrab('IsGhost', carElem) 

     def getTree(self): 
      aTree = Element('ApsMessage') 
      self.__addTag(aTree, 'MsgId', self.MsgId) 
      self.__addTag(aTree, 'MsgTime', self.MsgTime) 
      self.__addTag(aTree, 'Offset', self.Offset) 
      self.__addTag(aTree, 'TranId', self.TranId) 
      self.__addTag(aTree, 'Portal', self.Portal) 
      moveElem = Element('Move') 
      self.__addTag(moveElem, 'StartTime', self.StartTime) 
      self.__addTag(moveElem, 'EndTime', self.EndTime) 
      self.__addTag(moveElem, 'Type', self.Type) 
      aTree.append(moveElem) 
      carElem = Element('Car') 
      self.__addTag(carElem, 'Name', self.Name) 
      self.__addTag(carElem, 'UniqueId', self.UniqueId) 
      self.__addTag(carElem, 'Orientation', self.Orientation) 
      self.__addTag(carElem, 'Wells', self.Wells) 
      self.__addTag(carElem, 'Axles', self.Axles) 
      self.__addTag(carElem, 'Length', self.Length) 
      self.__addTag(carElem, 'IsEngine', self.IsEngine) 
      self.__addTag(carElem, 'IsGhost', self.IsGhost) 
      aTree.append(carElem) 
      return aTree 

     def getTag(self): 
      return self._element.tag 

     def __tagGrab(self, tagName, parent=self._element): 
      ''' 
      Helper function for XML reading operations. 
      ''' 
      return parent.find(tagName).text 


     def __addTag(self, element, tagName, textValue=None): 
      ''' 
      Helper function for setting values for XML elements. Note that this 
      function assumes unique tag name values within element. 
      ''' 
      element.append(Element(tagName)) 
      if textValue: 
       element.find(tagName).text = str(textValue) 

所以,如果我的所有方法都有自己的第一個參數,調用堆棧在類聲明的問題指指點點,但對自我不被全局定義的,然後我做了什麼錯在這裏? PS:如果它有幫助,我使用最新的IronPython解釋器來防止由於某種原因IronPython特定的問題。

回答

11

的問題是在你的__tagGrab功能:

def __tagGrab(self, tagName, parent=self._element): 

你不能self在頭 - 而有None,然後在體內正確:

def __tagGrab(self, tagName, parent=None): 
    if parent is None: 
     parent = self._element 
    ... 

的原因是,當類對象正在創建中沒有self;除globals()(其中有Element加上一些其他項目),Python獲得__tagGrab時定義的唯一名稱是__module__,__init__,getTreegetTag

作爲一個實驗來證明這一點,試試這個:

class TestClassCreation(object): 
    print("Started creating class") 
    print("names so far: %s" % vars()) 

    def __init__(self): 
     pass 
    print("now we have %s" % vars()) 

    def noop(self, default=None): 
     print("this gets run when noop is called") 
    print("and now have %s" % vars()) 
    print() 

    print("and now we'll fail...") 
    def failure(self, some_arg=self.noop): 
     pass 
    print("we never get here...") 
+0

感謝你爲這個很好解釋的答案! –

相關問題