python - 如何在 python 中创建全新的对象而不干扰旧对象?

标签 python oop

我对Python非常陌生,面临着下面定义的这个问题。 我正在从名为“Node”的类创建多个图表

class Node(object):
    label = ""
    nexts = ()
    prevs = ()
    pos_tag = ""
    visited = False    # black = False (unexplored),  white = True (explored)
    score = 0

我的图形生成函数是

    # Generating the graph
    def generate_graph(self, text, startnode, endnode):
        sentences = self.convert_to_sentences(text)
        sentences = [sentence.replace(",","") for sentence in sentences]
        while(" ." in sentences):
            sentences.remove(" .")

        length = len(sentences)
        self.START = startnode
        self.END = endnode
        G = nx.Graph()
        G.add_node(self.START)
        G.add_node(self.END)
        for i in range(0, length):
            words = sentences[i].split()
            sent_size = len(words)
            v = [Node() for i in range(sent_size)]
            for j in range(0, sent_size):
                label = words[j]
                tag = nltk.pos_tag(nltk.word_tokenize(label))[0][1]

                if self.exists_node(self.START, label, tag):
                    v[j] = self.get_existing_node(self.START, label, tag)
                else:
                    v[j] = self.create_new_node(label, tag)
                    G.add_node(v[j])
                if j==0:
                    tup = (v[j],)
                    self.START.nexts = self.START.nexts + tup
                    G.add_edge(self.START, v[j])
                if v[j].label == ".":
                    self.add_edge(v[j], self.END)
                    G.add_edge(v[j], self.END)
                if not self.exists_edge(v[j-1], v[j]):
                    self.add_edge(v[j-1], v[j])
                    G.add_edge(v[j-1], v[j])

        Nodes = []
        graph_size, Nodes = self.graph_size(self.START)
        for i in range(0, graph_size):
            print(Nodes[i].label, Nodes[i].pos_tag)
            leng = len(Nodes[i].nexts)
            for x in range(0, leng):
                print(Nodes[i].nexts[x].label, Nodes[i].nexts[x].pos_tag)
            print(" ")


        #nx.draw(G)
        paths = self.find_paths(G, self.START, self.END)
        return paths

我多次调用这个图形生成函数来生成几个图形,第一个图形生成得非常好,但是第二个和后续图形包含前面图形的边,即它已经包含前面图形的状态,并且只是在上面添加新边它。

考虑这个从句子生成单词级图的示例:-

Sentence-1 :- Merlyn 是一只大猫。

句子 1 创建的图具有来自 Merlyn->is 的边,这非常好。

Sentence-2:- Merlyn 过去常喝牛奶。

句子 2 创建具有来自 Merlyn->usedMerlyn->is 的 2 条边的图

句子 2 应该只有单边Merlyn->used 提前致谢

最佳答案

所有节点变量都应该是实例级变量而不是类级变量。

class Node(object):
    def __init__(self):
        self.label = ""
        self.nexts = ()
        self.prevs = ()
        self.pos_tag = ""
        self.visited = False
        self.score = 0

关于python - 如何在 python 中创建全新的对象而不干扰旧对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882916/

相关文章:

python - 了解 `np.ndarray` 子类化中的默认值

c++ - 重载 C++ 算术运算符

c++指向类的指针数组,初始化为空指针

c++ - 对于开始游戏开发探索的新手,您推荐哪些游戏创意?

python - 将数据分配给单独的数据框,按年份组合和排序

python - Fabric 密码

c# - 你能去掉装饰器吗?

perl - 旧 TPJ 文章中的 8 queen 问题缺少到主模块 Queen 的链接

python - 使用 Django 的 ORM 的模型继承方法

python - 您能检查一下 "unsupported operand type(s) for -: ' str' 和 'int' "