python中的名稱空間是名稱(標識符)到對象的映射。
具體來說,python為模塊、函數、類、對象保存一個字典(__dict__),里面就是重名稱到對象的映射。
可以參看下面python程序的輸出:
print('globals:') print(globals().keys()) print('') x = 1 print('globals after definition of x:') print(globals().keys()) print('') if x == 1: y = 2 z = 3 print('globals inside if :%s' % (globals().keys())) print('locals inside if: %s' % (locals().keys())) del y print('locals after del: %s' % (locals().keys()))
而在面向對象編程中,python與C++最大的差別之一就在於python中的namespace是可以動態變化的,類的成員,類實例的成員都可以動態添加,所做的不過是在相應的namespace字典中添加一項。這里特別指出的值,函數(成員函數或全局函數)也有自己的namespace字典,甚至可以動態添加
class Test1(object): x = 1 def __init__(self): self.y = 2 self.z = 3 def func(self): print('test') func.fx = 2 print(Test1.__dict__) t1 = Test1() print(t1.__dict__) print(t1.func.__dict__)
由此,我們可以理解一下,python中所謂的構造函數__init__所做的事情了,因為成員方法第一個傳入的是self引用,相當於
t1 = Test1()的時候調用Test1.__init__(t1),然后在構造函數里面添加了類實例t1的namespace字典項