直接Import:(限於mscorlib.dll裡的所有命名空間和類)
IronPython可以方便的使用許多.net的類,而不用顯式的添加引用
比如,使用from System.Collections import * 我們會可以添加對.net集合類的引用
from System.Collections import *list1=ArrayList()list1.Add(1)list1.Add(2)list1.Add(3)print list.Countht=Hashtable()ht.Add(1,1)ht.Add('2',2)
print ('aaaa')
先添加引用,再import
凡是mscorlib.dll裡的所有命名空間和類都是可以用上面的方法直接import,因為這個mscorlib.dll是預設引用的
(通過ipy.exe -X:SaveAssemblies:可以把ipy產生的組件快取下來,用反編譯工具查看就可以看到)但是如果需要引入其他模組中的類,
就需要通過clr模組提供的添加引用的一系列方法,就好像在寫.net程式的時候需要先添加引用,再using一樣,
比如如果你希望使用System.Xml命名空間下的類
import clrclr.AddReference("System.Xml")from System.Xml import *doc=XmlDocument()doc.Load("test.xml")
用反編譯工具查看產生的程式集,可以發現程式集並沒有增加引用,在程式中我們可以看到,對引用的添加是通過反射動態進行的
關於引用的有趣的現象
另外還有有趣的現象,當引用了.net類後會添加,python對象會多出許多方法和屬性,也就是說python對象會具有很多的.net屬性和方法,下面我們就來看看這個現象,首先我建立了一個list,然後通過dir方法展示初list的所有方法,然後,我們import clr,或者import System,在把剛才建立的list對象的所有屬性和方法展示出來
a=[1,2,3]method=dir(a)print 'before import'print methodimport clrmethod=dir(a)print 'after import'print method
輸出為
before import
['__add__', '__class__', '__contains__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__getitem__', '__getslice__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__len__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setitem__', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
after import
['Add', 'AddSequence', 'Append', 'Clear', 'CompareTo', 'Contains', 'ContainsValue', 'CopyTo', 'Count', 'DeleteItem', 'DeleteSlice', 'Equals', 'Extend', 'Finalize', 'GetDynamicType', 'GetEnumerator', 'GetHashCode', 'GetLength', 'GetObjectArray', 'GetSlice', 'GetType', 'InPlaceAdd', 'InPlaceMultiply', 'Index', 'IndexOf', 'Initialize', 'Insert', 'IsFixedSize', 'IsReadOnly', 'IsSynchronized', 'ListEnumeratorCollection', 'Make', 'MakeDynamicType', 'MakeEmptyList', 'MakeList', 'MemberwiseClone', 'MultiplySequence', 'Pop', 'Reduce', 'ReferenceEquals', 'Remove', 'RemoveAt', 'Reverse', 'ReverseMultiply', 'RichEquals', 'RichGetHashCode', 'RichNotEquals', 'SetSlice', 'Sort', 'SyncRoot', 'ToCodeString', 'ToString', '__add__', '__class__', '__contains__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__getitem__', '__getslice__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__len__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setitem__', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
通過比較,我們可以發現在import了.net的命名空間或者類後,列表增加了許多大寫字母開頭的方法和屬性,這樣做的作用也許是方便python對象和.net對象的互動,比如用下面的語句初始化一個ArrayList是成立的
list=ArrayList([1,2,3])len(list)
我們可以看到list的長度為三,也就是說我們通過把一個python的list賦值給ArrayList的建構函式,從而建立了一個ArrayList,我們知道
ArrayList的建構函式可以接受一個ICollection作為參數,從而初始化ArrayList,這說明python內建的list類一定從ICollection繼承,
那麼他肯定具有ICollection所提供的方法,然後在沒有引入這個.net命名空間或者類的時候,我們用dir命令沒有看到這些方法,
因為這個時候這些方法不是必要的,內建列表的方法已經足夠用了,然而一旦發生引用,那麼像剛才那種互操作就有可能發生,
所以這些方法都必須展示出來,準備被調用
import與using的區別
1)import可以引入一個類,比如import System.Collections.ArrayList,而using只能引用命名空間
2)import引入一個類後,我們仍然要使用帶命名空間的完整命名去使用他,比如在通過import System.Collections.ArrayList後希望使用
ArrayList,必須這樣用
arrayList=System.Collections.ArrayList()
直接寫arrayList=ArrayList()會出錯,而using一旦引用一個命名空間,就可以不用加命名空間的首碼,直接使用這個類.如果想要在python中
方便的使用這些類,請使用from ... import ...