2017-06-02 68 views
1

我是Python類中的新成員,並嘗試通過Tkinter編寫科學代碼的接口。但是我不能從一個類或函數中調用一個函數(它在另一個類中並打開一個不同的框架)。我一直在尋找2天以上,但找不到我的案件的答案。如果你解釋爲像解釋一個孩子,我會很高興,因爲我不知道很多技術細節。無法從其他類調用函數到某個類

我的代碼結構是這樣的:

class first_class(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
       .... 
     def WhateverFunction(): 
      "do sth" 
class second_class(tk.Tk): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
       ..... 
     **I want to use "WhateverFunction" here** 
       ..... 

所以基本上,我無法從其他類訪問該功能。

我在網上找到的搜索類似Python using methods from other classes方法。 Bu這並沒有解決我的問題。這也許是因爲我正在使用不同的Tkinter框架。我現在不...謝謝你,歡呼!

+0

如果要使用該功能,則需要從第一個類繼承。 'class second_class(first_class):'或從'first_class()中調用類方法WhateverFunction()' –

+0

'WhateverFunction'是否需要成爲'first_class'的方法?注意:你的代碼片段縮進的方式,'WhateverFunction'實際上是在first_class中定義的。__init__',因此只能在'first_class .__ init__'中訪問, –

+0

@brunodesthuilliers啊......已經把它放到了複製/粘貼或縮進錯誤。但是,是的,這會改變任何可能的答案 –

回答

1

在您的代碼中,您將函數WhateverFunction定義爲__init__中的本地函數。所以從代碼的其他部分看不到它,這是不可能被調用的。例如,您可以將您的功能實現爲一種方法。它應該是這樣的:

class first_class(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
      .... 
    def WhateverFunction(self): 
     "do sth" 

現在的功能也隨處稱爲的first_class實例的方法:

first_class_instance = first_class() 
first_class_instance.WhateverFunction() 
+0

好吧,除了缺少'self'之外,它仍然可以通過'first_class.WhateverFunction()'調用......這並不是不可能被調用。 –

+0

@JonClements看看OP的代碼。 'WhateverFunction'在'__init__'中是局部的,所以它不能被調用,因爲它不存在於外部。 – Fomalhaut

+0

是的......只是注意到......看看我對布魯諾問答的評論。如果這是故意的,那麼你是正確的。 –

-1

只需創建該類的一個實例,並在second_class實例應該由第一個實例組成時調用該方法。

def second_class(tk.Tk): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 

     first_object = first_class().WhateverFunction() 

現在比較好的辦法是從不是第一個繼承second_class,並呼籲考慮這兩類方法具有相同的父,提供傳承纔有意義。

def second_class(first_class): 

    def __init__(self, parent, controller): 
     super(second_class, self).__init__(parent, controller) 

     self.WhateverFunction() 

注: - 請儘量遵循的Python的某些慣例像駱駝和方法/與蛇的情況下功能命名類。

+0

繼承很可能不是一個「更好的方法」...組合/委託通常是更好的選擇,實際上在GUI類之外定義的普通函數或實用程序類也是共享代碼而不引入不適當依賴性的好方法。 –

+0

如果他將上面的類用作mixin,該怎麼辦?我同意組成通常比繼承好,但有些地方繼承會更有意義。 – hspandher

+0

「有地方」確實 - 我的意思是,有幾個地方繼承是正確的解決方案。只有少數...現在我們沒有足夠的上下文來真正地說出什麼是最好的解決方案,因爲我們不知道「WhateverFunction()」是什麼,也不知道它是否真的屬於'first_class'開始;) –

0

我問完全相同的問題就在這裏了一段時間後沒有響應。基本上,你不能這樣做。 WhateverFunction__init__範圍內,其本身可以只稱爲second_class存在。這是通過與您關聯的'使用其他課程中的方法'問題中描述的方法完成的,但是對於您要執行的操作而言,這是無用的,因爲您只能從__init__獲得輸出,因此您不能訪問該功能中定義的任何功能。

要解決這個問題,爲什麼不定義WhateverFunction全球然後調用它像往常一樣,或者宣佈它__init__功能之外,但仍然在first_class