要敢說真話,你的問題不作一大堆的意識,這是爲什麼:
在點時foo
定義兩個全局的say_foo
調用者之間,沒有建立連接並talk
並將兩個函數導入到代碼的頂部。
例如,解釋器不會抱怨如下:
class foo(object):
def say_foo(self):
method1()
def talk(self):
method2()
儘管沒有進口的,這仍然是有效的代碼。您當然不能撥打say_foo
和talk
,但不會收到NameError
。
下也未嘗不可:
from module1 import method1
from module2 import method2
class foo(object):
def say_foo(self):
method1()
def talk(self):
method2()
obj1 = foo()
obj1.say_foo()
def method1(): pass
obj1.say_foo()
obj2 = foo()
obj2.say_foo()
我留給你找出哪些method1
被調用時。
現在,說了這麼多,有一些你可以做。如果您檢查方法對象co_names
,那會給你list of names that are used by the method:
In [30]: foo.say_foo.im_func.func_code.co_names
Out[30]: ('method1',)
In [31]: foo.talk.im_func.func_code.co_names
Out[31]: ('method2',)
這顯然是不完全一樣的,你在問什麼,並根據可能會或可能不會有用什麼你打算這樣做。
它也幾乎可以肯定是CPython特有的。
來源
2011-08-03 13:47:03
NPE
say_foo的'代碼()'將只包含對全局名稱的引用'method1',並且在執行'say_foo()'的過程中,該名稱將被解析爲該全局名稱在執行時指向的任何對象。這可能是一個完全不同於'method1'在定義'say_foo()'時指向的對象。 (而且,'from module1 import method1'中的命名沒有多大意義,Python中沒有模塊級別的「方法」。) –
@Sven,我已經說過函數而不是方法了! – user739807
是的,這就是它們在Python中的調用方式,但這個評論只是一個附註。我的主要觀點是,你想要做的事情沒有多大意義。 –