比方說,我有3個文件:python中的導入關鍵字如何實際工作?
a.py
from d import d
class a:
def type(self):
return "a"
def test(self):
try:
x = b()
except:
print "EXCEPT IN A"
from b import b
x = b()
return x.type()
b.py
import sys
class b:
def __init__(self):
if "a" not in sys.modules:
print "Importing a!"
from a import a
pass
def type(self):
return "b"
def test(self):
for modules in sys.modules:
print modules
x = a()
return x.type()
c.py
from b import b
import sys
x = b()
print x.test()
和運行蟒蛇c.py
Python帶有背面抱怨:
NameError: global name 'a' is not defined
但是,在sys.modules中A爲:
copy_reg
sre_compile
locale
_sre
functools
encodings
site
__builtin__
operator
__main__
types
encodings.encodings
abc
errno
encodings.codecs
sre_constants
re
_abcoll
ntpath
_codecs
nt
_warnings
genericpath
stat
zipimport
encodings.__builtin__
warnings
UserDict
encodings.cp1252
sys
a
codecs
os.path
_functools
_locale
b
d
signal
linecache
encodings.aliases
exceptions
sre_parse
os
,我還可以改變b.py使得:
X = A()
更改爲
x = sys.modules [「a」]。a()
而python會很高興地運行它。
一對夫婦從這個出現的問題:
爲什麼蟒蛇說,這不知道是,當它在sys.modules中呢?
正在使用sys.modules「適當」的方式來訪問類和函數的定義?
什麼是導入模塊的「正確」方式?
即 從模塊的進口X
或
導入模塊
其實,當你有一個可選的依賴項時,這可能是一個非常好的功能。它遍佈Python標準庫。主要的是要確保你聲明的任何標記(在這種情況下爲「桌面」)在某種意義上需要是「等價的」。也就是說,你要麼使用'office'的'desk'實現,要麼使用'home'的'desk'實現,但它們都是辦公桌,所以你可以對其中的任何一個做同樣的事情。 – 2010-06-22 15:58:59
我可以看到有關創建可選依賴項的唯一好處是它是一種性能破壞。無論用戶需要什麼功能,您都可以導入所有依賴項,但涉及的內存使用量超過您可能會喜歡使用的內存量,並且可能會降低性能。這可能是爲什麼他們在標準庫中使用可選的導入。性能攻擊通常會弄糟代碼,使其不易讀,這也不例外。最清楚的事情就是始終將導入放在文件頂部 - 這在我所知道的幾乎所有編程語言中都適用。 – eeeeaaii 2010-06-22 16:42:37