这几天本菜鸟在学习数据结构与算法,学习数据结构与算法免不了要手动实现这些数据结构与算法。在用类定义这些对象的时候,发现总是出现带有 _ ,__ 和__xx__ 的函数,一开始也没怎么在乎,想着这些也学过,可是今天仔细思考一下这些用法与区别,才发现已经忘的七七八八了,就这样好奇心逼着我去找出他们的区别。阅读了几篇博客以后,本菜鸟知道了这三兄弟的区别。python
Python中是不存在真正的私有方法的,可是为了实现相似于c++中的私有方法,因而就在类的方法或者属性前加一个“_”,意味着该方法或者属性就不该该被调用了。c++
class A(object):
def _test(self):
print("这个函数不该该经过_tset调用,而应该经过test调用")
def test(self):
return self._test()
a = A()
a._test()
a.test()
复制代码
结果算法
这个函数不该该经过_tset调用,而应该经过test调用
这个函数不该该经过_tset调用,而应该经过test调用
复制代码
由此可得,这个方法是能被调用的,但出于某种约定,咱们是通常不去调用的。数据结构
双下划线表示的是私有类型的变量,既然是私有了,那确定就不容许子类访问了,只容许这个类(self)自身访问。函数
class A(object):
def __test(self):
print("I am test in A")
def test(self):
return self.__test()
a = A()
a.test()
复制代码
结果:学习
I am test in A
复制代码
返回的结果是咱们预料之中的。spa
接着,咱们给A添加一个子类,并从新定义它的__test()方法。code
class B(A):
def __test(self):
print("I am test in B")
b = B()
b.test()
复制代码
如今,结果是这样的:对象
I am test in A
复制代码
可见,子类B从新定义以后的__test()返回的依然是A类中的__method(),由此咱们能够知道以“__"开头的方法是不能被重写的,只容许在内部使用博客
这种方法被称为magic methods(魔术方法),通常是系统定义名字,相似于__init__(),通常是给Python调用的。
class WrongMethod(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 = WrongMethod(20)
print("num = ", num)
print("num + 10 = ", num + 10)
print("num - 10 = ", num - 10)
复制代码
结果
num = 20
num + 10 = 10
num - 10 = 30
复制代码
上面的例子就能比较好的提现出来,"__ xx __" 这种方法通常是Python调用的。