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字典项
时间: 2024-10-29 19:08:57