这里发布我的代码:这不是整个代码,但足以解释我的疑问。请丢弃任何代码行,你发现无关紧要
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 {}。
答案 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
,因为您总是可以使用类或实例属性。