Python对象交互

时间:2016-12-30 23:03:30

标签: python class object encapsulation interaction

所以,在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;我想做的是让这个物体能够改变地球的状态,它的不同变量。

4 个答案:

答案 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