请简述Python2与Python3中的区别,python3有什么用
在查看一些Python开源代码时,经常会看到以下划线或双下划线开头的方法或属性。它们的功能是什么,有什么区别?今天来总结一下(注:以下代码是在Python3下测试通过的)
_的含义
python的类中没有真正的私有属性或方法,也没有真正的私有化。
但是,出于编程的目的,我们经常需要区分私有方法和公共方法,以便于管理和调用。那么用Python怎么做呢?
通常,Python规定带_下划线的属性和方法是私有方法或属性,以指示它们不应被外部调用或从ModuleA import *导入。如果调用,不会有错误,但是不符合规范。
下面的代码演示添加_的方法及其在类外部的可访问性。
classTestA:
定义_方法(自身):
print(Iamaprivatefunction。)
定义方法(自身):
回归自我。_方法()
ca=TestA()
ca.method()的输出:
Iamaprivatefunction。在类TestA中定义了一个_method方法,按照约定不能在类外直接调用。为了在外面使用_method方法,定义了一个method方法,method方法调用_method方法。
但是我们应该记住,带有_的方法也可以在类外调用:
加州。_method()输出:
AprivateFunction的含义。_ _
Python中的_ _和一个叫名字mangling的技术有关,也叫名字修饰。在许多现代编程语言中,这种技术用于解决因需要唯一名称而引起的问题,如命名冲突/重载。
Python以双下划线开头,以防止子类覆盖这个属性方法。这是通过在实例化类时自动转换,并在类中双下划线开头的属性方法前添加“_ class name”来实现的。
classTestA:
def__method(自我):
print( ThisisamethodfromclassTestA )
定义方法(自身):
回归自我。_ _方法()
classTestB(TestA):
def__method(自我):
打印( ThisisamethodfromcalssTestB )
ca=TestA()
cb=TestB()
ca .方法()
cb.method()的输出结果:
Thisisamethodfromcla
ssTestA
ThisisamethodfromclassTestA在类TestA中,__method方法其实由于name mangling技术的原因,自动转换成了_TestA__method,所以在A中method方法返回的是_TestA__method,TestB作为TestA的子类,只重写了__method方法,并没有重写method方法,所以调用B中的method方法时,调用的还是_TestA__method方法。
注意:在A中没有__method方法,有的只是_A__method方法,也可以在外面直接调用,所以python中没有真正的私有化
不能直接调用__method()方法, 需要调用转换之后的方法
ca.__method()输出
Traceback(mostrecentcalllast):转换后的方法名为:_TestA__methodFile"",line1,inAttributeError:'TestA'objecthasnoattribute'__method'
ca._TestA__method()输出
ThisisamethodfromclassTestA在TestB中重写method方法:
classTestB(TestA):输出def__method(self):
print('ThisisamethodfromcalssTestB')
defmethod(self):
returnself.__method()
cb=B()
cb.method()
ThisisamethodfromcalssTestB现在TestB中的method方法会调用_TestB__method方法:
总结:
python中没有真正的私有化,但是有一些和命名有关的约定,来让编程人员处理一些需要私有化的情况。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。