请简述Python2与Python3中的区别,python3有什么用

  请简述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):

  File"",line1,inAttributeError:'TestA'objecthasnoattribute'__method'

转换后的方法名为:_TestA__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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: