所以,在Python 3中进行编程,我已经找到了一个问题的程序,我已经在这个(非)功能代码段中提炼了它的本质:
class One:
def __init__(self):
self.var1 = 1
def change(self):
two.var2 = 5
class Two:
def __init__(self):
one = One()
self.var2 = 2
one.change()
two = Two()
IDLE解释器抛出:
> Traceback (most recent call last):
File "C:/-", line 15, in <module>
two = Two()
File "C:/-", line 12, in __init__
one.change()
File "C:/-", line 6, in change
two.var2 = 5
NameError: name 'two' is not defined
显然,这样做:
class One:
def __init__(self):
self.var1 = 1
def change(self):
two.var2 = 5
class Two:
def __init__(self):
self.var2 = 2
one.change()
one = One()
two = Two()
...没有帮助,因为它给了我完全相同类型的错误。我真的不明白为什么会这样......或者如何以不同的方式构建它。我觉得上次我遇到这样的问题时,我通过嵌套类来避免它(相当混乱,只能在一个级别的嵌套中工作,据我所知),但我真的很想知道如何制作这两个对象可以相互通信。
编辑:我所拥有的是一个程序,其唯一的代码行实例化一个主类,让我们称它为“地球”#34;。在这个程序对象中,一切都发生了,包括其他类的实例化;让我们假设在这种情况下只有一个,并称之为“月亮”#34;我想做的是让这个物体能够改变地球的状态,它的不同变量。
答案 0 :(得分:2)
你误解了python是如何工作的。在分配两个之前,您无法呼叫two.var2 = 5
。但是,在实例化(two = Two()
)时,您将称为,因此您正在构建的对象尚未分配给two
。此外,对于访问全局范围的类而言,通常设计较差。
考虑使用依赖注入,在该类中为类提供所需数据的本地副本。这将采用def __init__(self, dependency): self.dependency = dependency
的形式。您甚至可以使用类Two
作为依赖项,创建对象的组合而不是继承。
我触及继承,它似乎是另一种解决方案:也许你的意思是说self.var2 = 5
,并让你的班级Two
继承自One
?
答案 1 :(得分:2)
在我看来,你只需要传递给one.change()你想要改变的对象
class One:
def __init__(self):
self.var1 = 1
def change(self, two):
two.var2 = 5
class Two:
def __init__(self):
self.var2 = 2
one.change(self)
one = One()
two = Two()
答案 2 :(得分:0)
&#34;你误解了python是如何工作的。&#34;我不会这样说的;我对OOP的掌握很少,特别是Python。但我离题了......
&#34;在分配两个之前,你不能打两个.var2 = 5.但你打电话 当你实例化时(两个= Two()),你就是对象 建筑尚未被分配到两个。此外,它通常是 类访问全局范围的设计很差。&#34;
我编辑了我的代码以反映这一点,或者至少我理解它的方式:
class One:
def __init__(self):
self.var1 = 1
def change(self):
two.var2 = 5
class Two:
def __init__(self):
self.var2 = 2
self.program()
def program(self):
one = One()
one.change()
two = Two()
我这样认为问题是第二个对象中的函数在第一个函数的 init 结束之前调用,但它仍然无法工作。无论如何,修补一些,我试过这个,这可能是构建它的合理方式:
class One:
def __init__(self):
self.var1 = 1
def change(self):
two.var2 = 5
class Two:
def __init__(self):
self.var2 = 2
one = One()
two = Two()
one.change()
......并且正如预期的那样有效。如果最后三行代码可以成为&#34; program-object&#34;的一部分,我将调查它并查看它是否可以工作。我正在使用并且仍在工作。或许我可以废弃&#34;程序对象&#34;总而言之,我只需要在主类中使用的几行代码就可以了。
无论如何,我需要的是Josef的解决方案。谢谢!但是你在做什么呢?通过使用&#34; self&#34;作为第二个对象方法的论据,你传递了什么? &#34;对象&#34;?对它的引用......?
答案 3 :(得分:0)
您有两个实例想要互相交互的类。每个实例都可以保留对另一个实例的引用,但循环引用与python是一个狡猾的业务,因为它们可能会混淆引用计数器,并且在不再使用它们时无法删除它们。
numpy.ndarray
模块允许您保持这些关系,而不会搞乱垃圾收集。所以,
weakref