2012-01-18 42 views
1

我有兩個文件。在第一個有一本字典準備出口:指定導入方法的上下文

__all__ = ['container'] 

def show_name(self): 
    myFunction() 
    print self.name 

container = { 
    'show_name': show_name 
} 

在第二個文件,我導入myFunction,我定義類Person

from myModule import myFunction 

class Person: 
    def __init__(self): 
     self.name = 'Bob' 
     self.show_name = types.MethodType(container['show_name'], self) 

person = Person() 

的問題是,當我叫person.show_name()我得到的錯誤:

NameError: global name 'myFunction' is not defined

我怎麼能有Person.show_name訪問相同的功能Person呢?

+1

where myfunction()defined? – soulcheck 2012-01-18 14:16:49

+0

我認爲你的意思是'容器',你寫了'display'。 – 2012-01-18 14:18:08

+0

@larsmans:修正,謝謝! – Randomblue 2012-01-18 14:20:33

回答

2

from myModule import myFunction移動到定義了show_name的文件中。


順便提一下,

class Person: 
    def __init__(self): 
     self.name = 'Bob' 
     self.show_name = types.MethodType(container['show_name'], self) 

使得('show_name',<bound_method>)一個鍵 - 值對中self.__dict__。這會導致Person的每個實例都獲得一個新的獨立鍵值對。

要節省內存,您可能需要將其更改爲Roman Bodnarchuk other solution

class Person: 
    show_name = container['show_name'] 
    def __init__(self): 
     self.name = 'Bob' 
+0

由於infite'import'循環問題,我不能這樣做,因爲人也需要'myFunction'。是否有另一種解決方案來確保關閉? – Randomblue 2012-01-18 14:21:39

+0

@Randomblue:你可以將'myFunction'作爲參數傳遞給'show_name'。 – 2012-01-18 14:23:00

+0

@Randomblue:你可以像larsmans建議的那樣做,或者重構'myModule',這樣你就可以導入正確的代碼而不會有任何導入問題。 – unutbu 2012-01-18 14:28:23