关于python的namespace探讨

     最近刚刚开始看python基础, 由于原来是使用java编程, 没有听到过 虚函数的概念,  虚函数的作用是实现动态联编,  类似于java的方法可以被子类重写的概念,是多态的一种表现。

    而今天看python的命名空间的时候,就懵了,即便是虚函数,可也作为一个对象存在啊,在命名的字典中无法找到,着实无法理解,烦请高手们赐教!

以下是我的测试代码, 其中#1,说明   1代表执行步骤, 后面是说明。 主要问题的发生在11步骤上:

# -*- coding: gbk -*-
"""
    这是一个测试 namespcace的范例
"""


print "第1次---testns全局_globals函数:" + str(globals())

#1, 字典里仅有基本的属性,貌似类似java的类装载一样先走了一遍通用属性(Object根类的加载?)

print "第1次----testns全局_locals函数:" + str(locals())  #2,  locals == golbals 的namespace

def testns1():
    print "testns1)_function_全局namespce:" + str(globals())



class Person:

    print "Pserson_globals()函数:" + str(globals())  #3-1, 字典里已包含testns1按照顺序生成的,还未包含Person

    print "Person_locals()函数:" + str(locals())    #3-2, 字典为:{'__module__': '__main__'},没有对应的方法
    
    def __init__(a):
        print "Pserson对象_globals函数:" + str(globals())
        print __name__

    def sayhello(a):
        print "sayhello_globals()函数:" + str(globals()) #8, 与module的globals 相同
        print "sayhello_locals()函数:" + str(locals())   #9,  本地只有p
        def checkSayHello():
            print "checkSayHello_globals()函数:" + str(globals())
            #10, 到这里已经证明全局globals都是同一个,即module的globals,后面无需再说明globals 
            print "checkSayHello_locals()函数:" + str(locals())
            #11, sayhello function  到底在哪里呢?,locals里没有(3-2步骤),globals里也没有
        checkSayHello()
        

def saidhello(a,b):
    print "saidhello里打着:"+ str(Person.sayhello) 
    print "saidhello_locals函数:" + str(locals()) 

print "第2次---testns全局_globals函数:" + str(globals())  #4,字典里已包含testns1,Person,saidhello

print "第2次----testns全局_locals函数:" + str(locals()) #5, 到这里已经证明module的locals和globals是相同的

    
 
testns1()   #6, 与module的globals 相同

p = Person() #7, 与module的globals 相同  包含上了p

p.sayhello() 

Person.sayhello = saidhello 

print "aaaaaaaaaaaaaaa:" + str(Person.sayhello)  #12, <unbound method Person.saidhello>  说指定到了一个未绑定的function

print "bbbbbbbbbbbbbbb:" + str(p.sayhello) #13, 绑定到p对象上的sayhello
Person.sayhello(p,2) 
p.sayhello(1)   

print "testns全局_globals函数:" + str(globals())

print "testns全局_locals函数:" + str(locals())

 

 

class Person:

print "Pserson_globals()函数:" + str(globals())  #3-1, 字典里已包含testns1按照顺序生成的,还未包含Person   

print "Person_locals()函数:" + str(locals())    #3-2, 字典为:{'__module__': '__main__'},没有对应的方法  

第22行的打印局部变量有问题,此时的下面__init__(),sayhello()均未被装载进来,这是顺序执行的,所以没有该局部变量,把此语句(22行)移到person类的最下面测试就出来了
#3-2 Person_locals()函数:{'__module__': '__main__', 'sayhello': , '__init__': }