2015-02-04 3 views
-4

Как часть проекта Python для начинающих, я в настоящее время создаю базу данных слов, будь то существительные, глаголы, определители, прилагательные.Извлечение объекта класса из словаря

Теперь проблема заключается в том, что слова, считываемые в программу с помощью метода lexicon.readfromfile, помещаются в словарь через экземпляр класса (будь то существительное, глагол или прилагательное). Это создало проблему, что я совершенно не знаю, как назвать эти объекты из словаря, так как они не имеют переменные в качестве ключей, а ячейку памяти (см ниже):

{<__main__.Verb object at 0x02F4F110>, <__main__.Noun object at 0x02F4F130>, <__main__.Adjective object at 0x02F4F1D0>, <__main__.Noun object at 0x02F4F170>} 

Кто-нибудь есть идеи, как Я могу называть эти ключи таким образом, чтобы я мог использовать их в своем коде?

Вот часть я застрял на:

Добавьте метод getPast() к Verb класса, который возвращает прошедшее время от Verb. Ваш метод getPast() может выполнить простую работу, извлекая значение «прошлого» из атрибутов.

Вот большинство коды, оставляя вне Noun и Adjective классов:

class Lexicon(object): 
    'A container clas for word objects' 

    def __init__(self): 
     self.words = {} 

    def addword(self, word): 
     self.words[word.stringrep] = word 

    def removeword(self, word): 
     if word in self.words: 
      del(word) 
      print('Word has been deleted from the Lexicon') 
     else: 
      print('That word is not in the Lexicon') 


    def getword(self,wordstring): 
     if wordstring in self.words: 
      return self.words[wordstring] 
     else: 
      return None 


    def containsword(self,string): 
     if string in self.words: 
      return True 
     else: 
      return False 


    def getallwords(self): 
     allwordslist = [] 
     for w in self.words: 
      allwordslist.append(self.words[w]) 
     return set(allwordslist) 

    def readfromfile(self, x): 
     filehandle = open(x, 'r') 
     while True: 
      line = filehandle.readline() 
      if line == '': 
       break 
      line = line.strip() 
      info = line.split(',') 
      if info[1] == 'CN' or info[1] == 'PN': 
       noun=Noun(info[0],info[1]) 
       noun.setattribute('regular',bool(info[2])) 
       self.addword(noun) 
      elif info[1] == 'A': 
       adjective=Adjective(info[0],info[1]) 
       adjective.setattribute('comparative', bool(info[2])) 
       self.addword(adjective) 
      elif info[1] == 'V': 
       verb=Verb(info[0],info[1]) 
       verb.setattribute('transitive', bool(info[2])) 
       verb.setattribute('past', info[3]) 
       self.addword(verb) 




    def writetofile(self, x): 
     filehandle = open(x, 'w') 

     for t in self.words.values(): 
      filehandle.write(t.getFormattedString() + '\n') 
     filehandle.close() 
#---------------------------------------------------------------------------#   

class Word(object): 
    'A word of any category' 

    def __init__(self,stringrep,category): 
     self.wordattribute = {} 
     self.stringrep = stringrep 
     self.category = category 

    def setattribute(self, attributename, attributevalue): 
     self.wordattribute[attributename] = attributevalue 

    def getvalue(self,name): 
     if name in self.wordattribute: 
      return self.wordattribute[name] 
     else: 
      return none 


    def __str__(self): 
     return self.stringrep + ':' + self.category 

    def __lt__(self,otherword): 
     return self.stringrep < otherword.stringrep 

class Verb(Word): 
    '"Represents a Verb."' 

    def __init__(self, stringrep, category): 
     super().__init__(stringrep,category) 

    def istransitive(self): 
     return self.transitive 

    def getFormattedString(self): 
     n = '{stringrep},{category}' 
     n = n.format(stringrep=self.stringrep, category=self.category) 
     for i in range(1,2): 
      for v,b in self.wordattribute.items(): 
       n = n+','+str(b) 
     return n 
+1

@jonrsharpe: :-P –

+0

Связанный: http://stackoverflow.com/q/1535327/3001761. Кроме того, это похоже на 'set', а не' dict'. – jonrsharpe

ответ

0

У вас есть set там, не словарь. A set позволит вам проверить, действительно ли данный экземпляр находится в наборе быстро и легко, но, как вы обнаружили, вы не можете легко получить определенное значение обратно, если вы уже не знаете, что это такое. Это нормально, потому что это не то, что для set.

С помощью словаря вы связываете ключ со значением при добавлении его в словарь. Затем вы используете ключ, чтобы вернуть значение. Поэтому сделайте словарь, а не набор, и используйте значащие ключи, чтобы вы могли легко вернуть значение.

Или, поскольку я вижу, что вы уже делаете список, прежде чем преобразовывать его в набор, просто верните это; вы можете легко получить доступ к элементам в списке по индексу. Другими словами, не создавайте проблему в первую очередь, и у вас ее не будет.

Смежные вопросы