对比Python中_,__,xx__xx

对比Python中___xx__xx

_ 的含义

  不应该在类的外面访问,也不会被from M import * 导入。 Python中不存在真正的私有方法。为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不属于API。

class A:
    def _method(self):
        print('约定为不在类的外面直接调用这个方法,但是也可以调用')
    def method(self):
        return self._method()   
​
a = A()
a.method()
a._method()
输出:
约定为不在类的外面直接调用这个方法,但是也可以调用 约定为不在类的外面直接调用这个方法,但是也可以调用

#类A中定义了一个_method方法,按照约定是不能在类外面直接调用它的
为了可以在外面使用_method方法,又定义了method方法,method方法调用_method方法。请看代码演示:

#但是加了_的方法也可以在类外面调用:

 

__的含义:

  这个双下划线更会造成更多混乱,但它并不是用来标识一个方法或属性是私有的,真正作用是用来避免子类覆盖其内容。用来解决需要唯一名称而引起的问题,比如命名冲突/重载等.

class A:
​
    def __method(self):
        print('This is a method from class A')
​
    def method(self):
        return self.__method()
​
class B(A):
    def __method(self):
        print('This is a method from calss B')

​
a=A()
b=B()
a.method()
b.method()
 
输出:
 
This is a method from class A
This is a method from class A

#在类A中,__method方法其实由于name mangling技术的原因,变成了_A__method,所以在A中method方法返回的是_A__method,B作为A的子类,只重写了__method方法,并没有重写method方法,所以调用B中的method方法时,调用的还是_A__method方法:

#因此,在我们创建一个以"__"两个下划线开始的方法时,这意味着这个方法不能被重写,它只允许在该类的内部中使用。

在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
转载请注明出处,谢谢。
 
 
 

猜你喜欢

转载自www.cnblogs.com/-abm/p/9930663.html
xx