2012-03-21 29 views
1

我在Python中遇到了類問題。 我想知道如何調用在其他python程序模塊中創建的對象。如何調用在模塊中創建的對象

讓我來舉個例子。我在「class_module.py」文件

def objectCase(): 
    object1 = class_name("object1") 
    object2 = class_name("object2") 
    object3 = class_name("object3") 

def other_objectCase(): 
    other_object1 = class_name("other_object1") 
    other_object2 = class_name("other_object2") 
    other_object3 = class_name("other_object3") 

隨着from class_module.py import *擁有這些對象,我想如果我使用objectCase()功能,我在我的節目,這些對象(object1, object2, object3),如果我用otherobjectCase()功能,我呼籲所有otherobject 。 但事實並非如此。 問題是什麼?

回答

4

您正在函數內部創建局部變量。一旦函數返回,它們就會丟失。如果您在調用代碼中需要這些對象以後,return他們主叫

return object1, object2, object3 

和綁定名字給他們

a, b, c = objectCase() 
+0

我怎麼能保持相同的名字出現在函數(因此「object1」,「對象2」,而不是「一」, 「b」)自動? – 2012-03-21 16:23:29

+0

@SniperWolf:基本上沒有。 – 2012-03-21 17:10:42

2

看看到文檔Scopes and Namespaces,名稱object1object2object3objectCase()函數的本地代碼,因此當您編寫代碼時,您將無法從主模塊訪問它們。

完成你想要將返回這些變量什麼的最典型方式:

def objectCase(): 
    object1 = class_name("object1") 
    object2 = class_name("object2") 
    object3 = class_name("object3") 
    return object1, object2, object3 

然後當你把它分配返回的值回相同的名字:

object1, object2, object3 = objectCase() 

沒有一種好方法可以自動保留與本地變量相同的名稱,但在這裏返回字典可能是合適的。而不是返回object1, object2, object3你可以返回{'object1': object1, 'object2': object2, 'object3': object3},然後調用函數可以做這樣的事情:

result = objectCase() 
# do something with result['object1'], result['object2'], or result['object3'] 
+1

我有同樣的問題閱讀此答案。我如何自動保留同名的函數(如「object1」,「object2」,而不是「a」,「b」)? – 2012-03-21 16:26:09

1

如果你想object1,...是在模塊的名字空間,你有幾種選擇:

object1, object2, object3 = objectCase() 

,或者,如果你不想處理任務那裏,你可以使用該函數的global關鍵字:

def objectCase(): 
    global object1, object2, object3 
    object1 = class_name("object1") 
    object2 = class_name("object2") 
    object3 = class_name("object3") 

,或者你可以完全跳過功能,只是有這樣的頂級代碼:

object1 = class_name("object1") 
object2 = class_name("object2") 
object3 = class_name("object3") 
+0

'global'實際上在這裏不起作用,因爲這個函數是從另一個模塊導入的,全局變量對模塊是全局的,而不是跨模塊。 – 2012-03-21 18:32:38

+1

'global'將使對象成爲它們創建的模塊中的全局對象,然後'from module import *'將能夠接受它們。 – 2012-03-21 18:37:51

+0

確實如此,但是每次你從'module'調用一個函數來更新全局變量的時候'會從模塊導入*'做一個相當混亂的程序結構。 – 2012-03-21 21:38:02

相關問題