2015-07-01 162 views
0

我想调用一个使用全局变量的类的方法,但似乎有我的逻辑有问题。通过类的全局变量?

在下面的代码中,A调用B,它调用C,它调用B的方法。

x = None 

class A(): 

    def __init__(self): 

     global x 
     x = B() 

class B(): 

    def __init__(self): 

     C() 

    def bla(self): 

     print('bla') 

class C(): 

    def __init__(self): 

     global x 
     x.bla() 

A() 

我得到的错误:

​​

我缺少什么?

回答

6

当你这样做x = B(),调用B()的结果不能B完成初始化后分配到x直到。但在创建B实例时会调用B.__init__(),并立即调用C()。换句话说,当你做x = B(),事情发生的顺序如下:

  1. 调用(在B.__init__()因为C()通话)B.__init__()
  2. 通话C.__init__()B()x
  3. 分配结果。

但第3步中不会发生,因为C.__init__()引发错误,因为第3步,以使对象尚未分配到x但还没有发生。

目前尚不清楚您要在此完成的任务,因此很难说如何更好地更改代码。 C.__init__无法使用直到C.__init__完成运行之后才会定义的变量。

+0

谢谢你的时间。我明白现在发生了什么。你能提出一种从B类中调用bla方法的方法吗?我只尝试使用全局变量,因为我相信它会起作用。从技术上讲,我所需要的是将这种B方法称为从A到B到C然后回到B方法。 –

+1

@VictorJosé:你什么时候需要/想打电话给'bla'?调用它很简单:只需从'B .__ init__'中删除对'C()'的调用,然后执行'x = B()',然后执行'x.bla()'。在你的例子中'C'的用途不明确,因为'C'除了调用'x.bla'外什么都不做。你为什么不直接从'B .__ init__'调用'self.bla()'?你应该编辑你的问题来解释C正在做什么以及它和B之间的关系。例如,你可能想让C接受一个参数,然后调用'C(self)',这样'C'可以在正在初始化的'B'实例上调用'bla'。 – BrenBarn

0

这是你的问题

你说 X = B() 很好,x是无,直到b完成初始化......这也意味着,直到完成c ^初始化,这将导致在C级的时候有问题你做

x.bla() 
+0

BrenBarn更好地解释它,请参考他的回答。 – AndrewGrant

0

这是因为x没有完全初始化,直到它完成调用每个类的init函数。在此完成初始化之前,您尝试访问全局x。