0

2つのメソッドのみで構成され、2つのパラメーターのみを受け取る単語オブジェクトを作成しました。この明らかな単純さにもかかわらず、それは私の理解を超えた方法で動作しています。同じ最初の引数(この場合は「分解」)で同じオブジェクトの2つのインスタンスを作成すると、2番目のインスタンスが最初のインスタンスに何らかの形で干渉します。インスタンスを印刷すると、それらが実際に分離していることがわかります。それでは、なぜこのように相互作用しているのでしょうか。

# Example tested with Python 2.7.3

from collections import namedtuple
DefinitionTuple = namedtuple("Definition", "word word_id text pos")


class Word(object):

    def __init__(self, word, defs=None):
        """"""
        self.definitions = []       
        self.word = word

        if defs != None:
            for each in defs:
                try:
                    each.pos
                    if each.word.lower() == self.word.lower():
                        self.definitions.append(each)
                except AttributeError:
                    raise AttributeError("Definitions must be named tuples")

            self.orderDefinitions()


    def orderDefinitions(self):
        """"""  
        ordered = sorted(self.definitions, key=lambda definition: definition.pos)
        for i,each in enumerate(ordered):
            each.pos = (i+1)

        self.definitions = ordered


class Definition(object):
    """"""
    def __init__(self, definition):
        """Incoming arg is a single namedtuple"""       
        self.word = definition.word
        self.word_id = definition.word_id
        self.text = definition.text
        self.pos = definition.pos       


if __name__ == "__main__":
    nt1 = DefinitionTuple("dissemble", 5, "text_string_a", 1)
    nt2 = DefinitionTuple("dissemble", 5, "text_string_b)", 2)
    nt3 = DefinitionTuple("dissemble", 5, "text_string_c", 3)   

    # Definiton objects
    def_1 = Definition(nt1)
    def_2 = Definition(nt2)
    def_3 = Definition(nt3)



    dissemble = Word("dissemble", [def_1, def_2, def_3])
    print "first printing: "
    for each in dissemble.definitions:
        print each.pos, each.text

    # create a new instance of Word ...
    a_separate_instance = Word("dissemble", [def_3])    

    # ... and now the 'pos' ordering of my first instance is messed up!
    print "\nnow note how numbers differ compared with first printing:"     
    for each in dissemble.definitions:
        print each.pos, each.text
4

2 に答える 2

3

の新しいインスタンスを作成しますが、 :Wordの同じインスタンスを再利用します。def_3

a_separate_instance = Word("dissemble", [def_3])    

これはステートフルです。を使用して内部を見るとvars

print vars(def_3)
# create a new instance of Word ...
a_separate_instance = Word("dissemble", [def_3])    
print vars(def_3)

私たちは見る

{'text': 'text_string_c', 'word': 'dissemble', 'pos': 3, 'word_id': 5}
{'text': 'text_string_c', 'word': 'dissemble', 'pos': 1, 'word_id': 5}

によるorderDefinitions

于 2012-09-06T21:45:13.980 に答える
2

orderDefinitionsメソッドでは、オブジェクトのpos属性を変更しています。Definition

each.pos = (i+1)

したがってorderDefinitions、2回目の呼び出しでは、を実行しますdef_3.pos = 1

ただし、属性が変更されたこのオブジェクトdissembleへの参照を保持しているため、問題が発生します。def_3pos

于 2012-09-06T21:48:59.263 に答える