首次使用类,有助于调试

时间:2010-06-08 03:46:49

标签: python

这里发布我的代码:这不是整个代码,但足以解释我的疑问。请丢弃任何代码行,你发现无关紧要

enter code here
saving_tree={}   
isLeaf=False
class tree:
    global saving_tree
    rootNode=None
    lispTree=None
    def __init__(self,x):
        file=x
        string=file.readlines()
        #print string
        self.lispTree=S_expression(string)
        self.rootNode=BinaryDecisionNode(0,'Root',self.lispTree)

class BinaryDecisionNode:
    global saving_tree     
    def __init__(self,ind,name,lispTree,parent=None):

        self.parent=parent

        nodes=lispTree.getNodes(ind)
        print nodes
        self.isLeaf=(nodes[0]==1)
        nodes=nodes[1]#Nodes are stored
        self.name=name
        self.children=[]
        if self.isLeaf: #Leaf Node
            print nodes
            #Set the leaf data
            self.attribute=nodes
            print "LeafNode is ",nodes
        else:            
            #Set the question
            self.attribute=lispTree.getString(nodes[0])
            self.attribute=self.attribute.split()


            print "Question: ",self.attribute,self.name
            tree={}
            tree={str(self.name):self.attribute}
            saving_tree=tree
            #Add the children
            for i in range(1,len(nodes)):#Since node 0 is a question
               # print "Adding child ",nodes[i]," who has ",len(nodes)-1," siblings"
                self.children.append(BinaryDecisionNode(nodes[i],self.name+str(i),lispTree,self))

        print saving_tree

我想在save_tree {}中保存一些数据,我之前已经声明过,并希望在类外的另一个函数中使用该保存树。当我要求打印saving_tree时它打印但是,仅用于该实例.i想要save_tree {}让数据存储所有实例的数据并在外面访问它。 当我在课外要求打印saving_tree时,它打印出空{} .. 请告诉我所需的修改以获得我所需的输出并在课堂外使用saving_tree {}。

1 个答案:

答案 0 :(得分:2)

saving_tree不是global方法中的__init__ (这是与类主体不同的范围)。您可以通过添加global saving_tree作为方法中的第一个语句来修复此问题(并删除不起作用的正文中的语句)。

更好的方法是忘记global并改为使用类属性:

class BinaryDecisionTree(object):
    saving_tree = None
    def __init__ ...
        ...
        BinaryDecisionTree.saving_tree = ...

global总是充其量只是一种方法,而且转向OOP(面向对象编程,即class语句)的一个优点是它可以节省任何需求对于global,因为您总是可以使用类或实例属性。