Python3中_和__的用处和差异

在看一些Python开源代码时,常常会看到以下划线或许双下划线最初的办法或许特点,究竟它们有什么效果,又有什么样的差异呢?今日咱们来总结一下(注:下文中的代码在Python3下测验经过)

_ 的意义

在python的类中没有真实的私有特点或办法,没有真实的私有化。

但为了编程的需求,咱们常常需求差异私有办法和共有办法以便利办理和调用。那么在Python中如何做呢?

一般Python约好加了下划线 _ 的特点和办法为私有办法或特点,以提示该特点和办法不该在外部调用,也不会被from ModuleA import * 导入。假如真的调用了也不会犯错,但不契合标准。

下面的代码演示加了_ 的办法,以及在类外面临其的可拜访性。

class TestA:
    def _method(self):
        print('I am a private function.')
    def method(self):
        return self._method()
ca = TestA()
ca.method()

输出:

I am a private function.

在类TestA中界说了一个_method办法,依照约好是不能在类外面直接调用它的,为了能够在外面运用_method办法,又界说了method办法,method办法调用_method办法。

可是咱们应该记住的是加了_的办法也能够在类外面调用:

ca._method()

输出:

I am a private function.

__ 的意义

Python中的__和一项称为name mangling的技能有关,name mangling (又名name decoration命名润饰).在许多现代编程言语中,这一技能用来处理需求仅有称号而引起的问题,比方命名抵触/重载等.

Python中双下划线最初,是为了不让子类重写该特点办法.经过类的实例化时主动转化,在类中的双下划线最初的特点办法前加上”_类名”完成.

class TestA:
    def __method(self):
        print('This is a method from class TestA')
    def method(self):
        return self.__method()
class TestB(TestA):
    def __method(self):
        print('This is a method from calss TestB')
ca = TestA()
cb = TestB()
ca.method()
cb.method()

输出成果:

This is a method from class TestA
This is a method from class TestB

在类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 (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'TestA' object has no attribute '__method'

转化后的办法名为:_TestA__method

ca._TestA__method()

输出:

This is a method from class TestA


在TestB中重写method办法:

class TestB(TestA):
    def __method(self):
        print('This is a method from calss TestB')
    def method(self):
        return self.__method()
cb = B()
cb.method()

输出:

This is a method from calss TestB

现在TestB中的method办法会调用_TestB__method办法:

总结

python中没有真实的私有化,可是有一些和命名有关的约好,来让编程人员处理一些需求私有化的状况。


上一篇:Python eval的用法及留意事项
下一篇:Python爬取13个旅游城市,告知你五一咱们独爱去哪玩?

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854