对比Python中_
,__
,xx__xx
_
的含义
不应该在类的外面访问,也不会被from M import * 导入。 Python中不存在真正的私有方法。为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不属于API。
__
的含义:
这个双下划线更会造成更多混乱,但它并不是用来标识一个方法或属性是私有的,真正作用是用来避免子类覆盖其内容。用来解决需要唯一名称而引起的问题,比如命名冲突/重载等.
在A中没有method方法,有的只是_Amethod方法,也可以在外面直接调用,所以python中没有真正的私有化,看下例:
a.__method() #如果你试图调用a.__method,它还是无法运行的,就如上面所说,只可以在类的内部调用__method。
输出: --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-4-b8e0b1bf4d09> in <module>() ----> 1 a.__method() AttributeError: 'A' object has no attribute '__method'
可以这样调用
a._A__method() This is a method from class A
在B中重写method
class B(A): def __method(self): print('This is a method from calss B') def method(self): return self.__method() #现在B中的method方法会调用_B__method方法: b=B() b.method() 输出: This is a method from calss B
__xx__
前后双下划线
也叫魔术方法,就是不需要人为调用的方法,基本就是在特定的时间自动触发
当你看到"this"的时,就知道不要调用它。为什么?因为它的意思是它是用于Python调用的,如下:
例1: name = "igor" name.__len__() 输出: 4 例2: number = 10 number.__add__(20) 输出: 30
“xx”经常是操作符或本地函数调用的magic methods。在上面的例子中,提供了一种重写类的操作符的功能。
在特殊的情况下,它只是python调用的hook。例如,init()函数是当对象被创建初始化时调用的;new()是用来创建实例。
class CrazyNumber(object): def __init__(self, n): self.n = n def __add__(self, other): return self.n - other def __sub__(self, other): return self.n + other def __str__(self): return str(self.n) num = CrazyNumber(10) print(num)# 10 print(num + 5) # 5 print(num - 20) # 30 输出: 10 5 30
结论
- 使用oneunderline来表示该方法或属性是私有的,不属于API;
- 使用_justto_underlines,来避免子类的重写;
- 当创建一个用于python调用或一些特殊情况时,使用two_underline;
总结:python中没有真正的私有化,但是有一些和命名有关的约定,来让编程人员处理一些需要私有化的情况。
此文参考链接:
https://blog.csdn.net/m0_38063172/article/details/82179591
https://blog.csdn.net/yzl11/article/details/53792416
转载请注明出处,谢谢。