?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 = 2z = 3print('globals inside if :%s' % (globals().keys()))print('locals inside if: %s' % (locals().keys()))del yprint('locals after del: %s' % (locals().keys()))
?
python 命名空間、而在面向對象編程中,python與C++最大的差別之一就在于python中的namespace是可以動態變化的,類的成員,類實例的成員都可以動態添加,所做的不過是在相應的namespace字典中添加一項。這里特別指出的值,函數(成員函數或全局函數)也有自己的namespace字典,甚至可以動態添加
class Test1(object):x = 1def __init__(self):self.y = 2self.z = 3def 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字典項