【问题标题】:python difference between imported and defined class导入类和定义类之间的python区别
【发布时间】:2012-03-31 09:32:01
【问题描述】:

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

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,使用类的导入版本根本不存在。在我看来,对实例的调用方法依赖()在模块中而不是在我的脚本中进行。 有没有办法以某种方式修复导入,或者可能有一些不同的方法来创建依赖项?

【问题讨论】:

  • 永远不要使用eval,除非你真的知道自己在做什么。
  • 什么“问题”?您是否收到某种错误消息,但您忘记包括在内?我也没有在您发布的内容中看到任何import 声明;您的问题与导入有何关系?
  • 另外,那些eval() 语句应该做什么?
  • 我只发布了用于阐明预期功能的版本,如果您将类放在模块中并从那里导入,它将不再起作用。
  • eval() statemets 应该允许一个实例在另一个实例更改其值时保留另一个实例的名称,以便可以更新前一个实例

标签: python class import


【解决方案1】:

应该不需要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() 的调用实际上会提取新值。

【讨论】:

  • 谢谢,我还没有尝试过,我绝对应该这样做。不过尝试了其他一些事情,这让我得出结论,这不会那么容易。
  • 再次创建obj1实例时有一个小问题,依赖丢失。我想我也试图用 eval() 来克服这个问题。当然这不是什么大问题,我只需要避免覆盖实例,这似乎是一种不好的做法。
猜你喜欢
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多