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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM