python命名空间内置命令空间全局命名空间局部命名空间区别func函数内存地址NotImplementedError内置命令空间是python解释器,启动时可以使用的名称存储在内置命名空间built-innamesareinterpretedatstartup当程序加载到内存中时,全局命名空间写入的代码,而不是函数中的代码,在程序执行过程中从上到下依次加载到内存中,并放置我们在本地设置的所有变量名和函数名。命名空间是函数内部定义的名称。调用该函数时,将生成命名空间。随着函数执行结束,命名空间将消失。区别1.本地:可以使用全局和内置命名空间中的名称2.全局:可以使用内置命名空间中的名称,但不能使用局部变量示例:deffunc():a=1func()print(a)result:NameError:name'a'isnotdefined3、内置中:不能使用的局部和全局名称的顺序是这样的:内置>全局>局部例子:defmax():print("inmaxfunc")max()运行结果:inmaxfunc一般情况下,直接使用内置名称当我们全局定义一个与内置名称空间同名的名称时,我们会使用globalname逐级查找func函数的内存地址#函数名()函数调用#添加id为函数内存地址defmax():print("inmaxfunc")print(max)print(id(max))运行结果:2600343820760NotImplementedError在Python编程中raise可以实现报错功能,Cond报错功能itions可以由程序员自己定制。在面向对象编程中,可以保留一个方法接口不实现,在其子类中实现。如果要求它的子类必须被实现,不实现就会出问题,那么用raise方法就很好了。此时问题分类为NotImplementedError例子:classClassDemo(object):defrun(self):raiseNotImplementedErrorclassChildClass(ClassDemo):defrun(self):print("Helloworld")ChildClass().run()示例:classClassDemo(object):defrun(self):raiseNotImplementedErrordefwrong(self):#将引发TypeErrorNotImplemented="don'tdothis"returnNotImplementedclassChildClass(ClassDemo):defrun(self):print("Helloworld")defwrong(self):print("wrong")ChildClass().run()#Helloworldwrong=ClassDemo().wrong()print(wrong)#不要在这里这样做区分NotImplemented&&NotImplementedErrortype(NotImplemented)type(NotImplementedError)issubclass(NotImplementedError,Exception)TrueNotImplemented是Python内置命名空间中仅有的6个常量(Python中没有真正的常量)一,其他的分别是False、True、None、Ellipsis和__debug__。和Ellipsis一样,NotImplemented也可以重新赋值:NotImplemented="don'tdothis"是什么关系?答案是“没关系”。NotImplemented在Python中被广泛应用在二元魔术方法中,如__eq__()、__lt__()等,表示该类型不能对应其他类型的二元运算示例:classA(object):def__init__(self,value):self.value=valuedef__eq__(self,other):ifisinstance(other,A):print('比较一个A和一个A')returnother.value==self.valueifisinstance(other,B):print('将A与B进行比较')returnother.value==self.valueprint('无法将A与其他类进行比较')returnNotImplementedclassB(object):def__init__(self,value):self.value=valuedef__eq__(self,other):#raiseNotImplementedErrorifisinstance(other,B):print('比较一个B和另一个B')returnother.value==self.valueprint('无法比较B与其他类')returnNotImplementeda,b=A(1),B(1)aa,bb=A(1),B(1)a==aa#Trueb==bb#Truea==b#Trueb==一个#真实运行结果:ComparinganAwithanAComparingaBwithanotherBComparinganAwithaB表明,执行==运算符时,会先查找B的__eq__()方法,如果遇到则返回NotImplemented的值,它会依次搜索A__eq__()方法应该在什么时候使用NotImplementedError?NotImplementedError是RuntimeError的子类:issubclass(NotImplementedError,RuntimeError)#True官网的建议是,当你需要一个必须重写的方法才能使用时,它的作用类似于Java中的接口,用来定义一个未实现的抽象方法。