bxdg42578670 2010-05-31 12:07
浏览 464
已采纳

关于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())

 

  • 写回答

1条回答 默认 最新

  • 龙根 2010-05-31 16:06
    关注

    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__': }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?