2015-07-01 160 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。