-1

ここに 2 つのプログラムがあります。1 つは辞書を作成するプログラムで、もう 1 つはそれを実装するプログラムです。最初のプログラムは次のとおりです。

    class dictionary:
def _init_(self, pword=[]):
    self.word = pword

def addWord(self, nword):
    l = len(self.word)
    bp = -1
    for num in range(0,l):
        if self.word[num][0]==nword:
            return
        if self.word[num][0]>nword:
            bp = num
            break
    nl = [nword]
    self.word.append([])
    if bp>=0:
        for num in range(l-1,bp+1,-1):
            self.word[num] = self.word[num-1]
    else:
        bp+=1
    (self.word).insert(bp,nl)

def addKey(self, nword,key):
    l = len(self.word)
    for num in self.word:
        if num[0]==nword:
            if num.count(key)==0:
                num.append(key)
                return
    print("'"+nword+"' was not found in the present dictionary\n")

def display(self):
    if len(self.word)==0:
        print("Dictionary is currently Empty\n")
        return
    for num in self.word:
        for nw in num:
            print(nw+"\t")
        print("\n")

そしてもう一つは

import file
def main():
print("Running file")
td = file.dictionary()
td.addWord("A")
td.addWord("B")
td.addWord("C")
print("Words added")
td.addKey("A",1)
td.addKey("A",2)
td.addKey("B",3)
td.addKey("C",1)
td.addKey("C",3)
print("Keys added")
td.display()

main()

両方のプログラムは問題なくコンパイルされますが、2 つ目のプログラムを実行すると、次のエラーが発生します

Running file
Traceback (most recent call last):
  File "E:\Documents\Information Retrieval\ptrial.py", line 17, in <module>
    main()
  File "E:\Documents\Information Retrieval\ptrial.py", line 5, in main
td.addWord("A")
  File "E:\Documents\Information Retrieval\file.py", line 6, in addWord
    l = len(self.word)
AttributeError: 'dictionary' object has no attribute 'word'**
4

2 に答える 2

2

問題は、init メソッドが__init__代わりにあることです_init_(前後の二重アンダースコアを参照)。

def __init__(self, pword=[]):
    self.word = pword
于 2013-09-20T16:44:05.547 に答える
1
class dictionary:
    def _init_(self, pword=[]):
        self.word = pword

特別なメソッドの名前は、__init__1 つだけではなく、両側に 2 つのアンダースコアが付いています。したがって、これにより、リストが初期化されず、メソッドが自動的に呼び出されなくなります。

組み込みの dict を使用して、「辞書」をエミュレートできます。

class Dictionary:
    def __init__(self):
        self.dict = {}

    def addWord (self, nword):
        if nword not in self.dict:
            self.dict[nword] = []

    def addKey (self, nword, key):
        if nword in self.dict:
            self.dict[nword].append(key)
            return
        print('{0} was not found in the present dictionary'.format(nword))

    def display (self):
        if self.dict == {}:
            print("Dictionary is currently Empty\n")
        else:
            for k, v in self.dict.items():
                print('\t'.join(map(str,v)))
                print()

ただし、まだ存在しないaddWordを呼び出すたびにその場でキーを追加することもできるため、実際には必要ありません。次に、 a を使用してすべてを非常に単純にすることもできます。addKeynworddefaultdict

import collections
class Dictionary (collections.defaultdict):
     def __init__ (self):
         super().__init__(list)

     def display (self):
        for k, v in self.items():
            print('\t'.join(map(str,v)))
            print()

td = Dictionary()
td['A'].append(1)
td['A'].append(2)
td['B'].append(3)
td['C'].append(1)
td['C'].append(3)
td.display()
于 2013-09-20T16:44:53.493 に答える