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字典項
