python中的namespace

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

你可能感兴趣的:(namespace)