2017-12-06 9 views
1

私は音声認識システムを構築しており、そのためにコマンド用のインタフェースを構築しています。彼らは主題、動詞、形容詞、ワイルドカードで構成されています。私はそれをこのように実装:私はICommandの継承二つのクラスだがPythonの奇妙な振る舞い継承したクラスのリスト

class IWord(object): 
    strings = [] 

    def recognize(self, word): 
     return word in self.strings 

    def add_synonym(self, word): 
     self.strings.append(word) 


class Verb(IWord): 
    def __init__(self, words): 
     for word in words: 
      self.add_synonym(word) 


class Adjective(IWord): 
    def __init__(self, words): 
     for word in words: 
      self.add_synonym(word) 


class Object(IWord): 
    def __init__(self, words): 
     for word in words: 
      self.add_synonym(word) 


class WildCard(IWord): 
    def recognize(self, word): 
     return word is not None & word 


class ICommand(object): 
    words = [] 
    parameters = [] 

は:

class Command1(ICommand): 

    def __init__(self): 
     self.words.append(Verb(['do'])) 
     self.words.append(Object(['some'])) 
     self.words.append(WildCard()) 

class Command1(ICommand): 

    def __init__(self): 
     self.words.append(Verb(['lorem'])) 

を、私はこの部分をデバッグしていた場合:

for command in self.Commands: 
    if command.recognize(text): 
     return command 

command.wordsが含まれているように思えます'do'、 'some'、ワイルドカード、 'lorem'。私は何がそこに間違っていたかは分かりません。

答えて

4

、...クラス定義でwordsクラスバインド変数になります。 self.wordsを使用すると、派生クラス間で共有されているクラスバインド変数に定義されている(最初は空の)ディクショナリが返されるようになりました。

Better:定義を削除し、派生クラスの__init__self.words = []を追加してください。

+0

ひどいところがクラスバインド変数の継承なので、ひどくPythonで実装されていますか? – Curunir

+1

@クルニール私はそう言っていないでしょう。たとえば、 Javaの 'ICommand'クラスの静的リスト words = new ArrayList ()を定義します。これは同じように動作します。 –

5

self.wordsは、ICommandクラスのwords属性です(継承するとコピーされません)。したがって、追加すると、ICommandに追加されます。これは、それを継承するすべてのクラスに影響します。

おそらく、しかし、行うには良いものがのようになります。

words = []を書く
class Command(object): 
    def __init__(self, words): 
    self.words = words 
+0

そして、私はどのように子供にしか届かないでしょうか? – Curunir

+1

'words = []'を子クラスに追加します。しかし、実際には、クラスではなく、コマンドとしての一般的な 'Command'クラスをインスタンスとして持つ方がよいでしょう。 –