2012-03-14 65 views
-2

我想在实例的某些参数(不一定与示例中的类相同)之间创建依赖关系。我想出了以下代码,直到我决定将它移入模块并通过导入使用它。导入的和定义的类之间的python区别

class objectD(object): 
    def __init__(self,val1,val2,val3): 
    self.val1 = val1 
    self.val2 = val2 
    self.val3 = val3 

    def __str__(self): 
    return str(str(self.val1)+","+str(self.val2)+","+str(self.val3)) 

    def dependence(self,dependent): 
    print "values val1 and val2 of "+str(self)+" now depend on "+dependent 
    self.val1 = eval(dependent).val1 
    self.val2 = eval(dependent).val2 
    self.dependent = dependent 

    def update(self): 
    self.val1 = eval(self.dependent).val1 
    self.val2 = eval(self.dependent).val2 

#test 
obj1 = objectD(350,4,500) 
print obj1 
obj2 = objectD(230,1,1000) 
print obj2 
obj2.dependence("obj1")#problem with imported class occurs there 
print obj2 
obj1.val1 = 1315 
obj1.val2 = 6464 
print obj1 
obj2.update() 
print obj2 

问题似乎在分配依赖的实例通过使用导入的类的类根本不存在根据python。在我看来,调用方法依赖关系()对实例继续在模块中,而不是在我的脚本。 有没有办法以某种方式修复导入,或者可能是某种不同的方法来创建依赖关系?

+1

永远不要使用'eval',除非你真的知道你在做什么。 – Thomas 2012-03-14 21:02:12

+1

什么“问题”?您是否收到某种您忘记包含的错误信息?我也没有在您发布的内容中看到任何“import”声明;你的问题与导入有关吗? – kindall 2012-03-14 21:03:03

+0

另外,那些'eval()'语句应该做什么? – Blender 2012-03-14 21:03:58

回答

0

应该不需要eval。为什么不简单地做这个呢?

class objectD(object): 
    def __init__(self,val1,val2,val3): 
    self.val1 = val1 
    self.val2 = val2 
    self.val3 = val3 

    def __str__(self): 
    return str(str(self.val1)+","+str(self.val2)+","+str(self.val3)) 

    def dependence(self,dependent): 
    print "values val1 and val2 of "+str(self)+" now depend on "+dependent 
    self.val1 = dependent.val1 
    self.val2 = dependent.val2 
    self.dependent = dependent 

    def update(self): 
    self.val1 = self.dependent.val1 
    self.val2 = self.dependent.val2 

#test 
obj1 = objectD(350,4,500) 
print obj1 
obj2 = objectD(230,1,1000) 
print obj2 
obj2.dependence(obj1)#problem with imported class no longer occurs there 
print obj2 
obj1.val1 = 1315 
obj1.val2 = 6464 
print obj1 
obj2.update() 
print obj2 

这将如预期,因为dependent仅存储参考obj1,对象本身不在状态。所以致电update()的呼叫实际上会拉动新的值。

+0

谢谢,我没有尝试过这个,我绝对应该。尝试了一些其他的东西,这让我得出结论,它不会那么容易。 – 2012-03-14 21:18:19

+0

当再次创建obj1实例时,有一个小问题,依赖性丢失。我thik我试图用eval()来解决这个问题。当然这不是什么大问题,我只能避免重写实例,这似乎是一个不好的习惯。 – 2012-03-14 21:48:08