python中没有真正的私有化,但是有一些和命名有关的约定,来让编程人员处理一些需要私有化的情况。

_ 的含义

`_xxx `不能用于’from module import *’ 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。

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

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

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

 

__的含义:

`__xxx` 双下划线表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以

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__前后双下划线

也叫魔术方法,就是不需要人为调用的方法,基本就是在特定的时间自动触发

例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
 
 
 
此文参考链接:
https://blog.csdn.net/m0_38063172/article/details/82179591
https://blog.csdn.net/yzl11/article/details/53792416

对比Python中_,__,xx__xx的更多相关文章

  1. Python中_,__,__xx__的区别

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. #! /usr ...

  2. Python中_,__,__xx__方法区别

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 方法就是以单下 ...

  3. 接口测试基础——第7篇 Python中_、__、__func__之间的区别

    今天的东西很少,主要是给自己做个笔记,顺便帮大家普及一下Python中的边角知识: 1.if __name__ == "__main__"是什么意思 答:一个.py文件,如果是自身 ...

  4. python中 _、__、__xx__() 区别及使用场景

    1.访问权限(private.public)与继承方式(只有public继承) 在面向对象编程语言中,类的属性与方法都会设置访问控制权限,从而满足我们的设计需求.一般而言,我们通常会将对象的属性设置为 ...

  5. [Python]Python章1 Python中_的故事

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 本文为译文,版 ...

  6. python中_、__、__xx__(单下划线、双下划线等)的含义

    (1)_xxx "单下划线 " 开始的成员变量相当于私有变量,也叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问(可以定义有点像java中的ge ...

  7. python中class的定义及使用

    #类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法. #对象:它是类的实例化. #方法:类中定义的函数. #类(Class) 由3个部分构成: ...

  8. 第8.33节 Python中__getattr__以及__getattr__与__ getattribute__的关系深入剖析

    一. 引言 前面几节分别介绍了Python中属性操作捕获的三剑客:__ getattribute__方法.__setattr__方法.__delattr__方法,为什么__ getattribute_ ...

  9. python中 __name__及__main()__的使用

    python中 __name__及__main()__的使用 #hello.py def sayHello(): str="hello" print(str); if __name ...

随机推荐

  1. cocos2dx2.x&3.x部分函数对照表

    | v2.1 names | v3.0 names | | ccp | Point | | ccpNeg | Point::- | | ccpAdd | Point::+ | | ccpSub | P ...

  2. git clean(转载)

    git clean命令用来从你的工作目录中删除所有没有tracked过的文件. git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以 ...

  3. 原生 JavaScript 实现 state 状态管理系统

    原生 JavaScript 实现 state 状态管理系统 Build a state management system with vanilla JavaScript | CSS-Tricks 在 ...

  4. CF1B Spreadsheets

    题意翻译 人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统: 第一列被标为A,第二列为B,以此类推,第26列为Z.接下来为由两个字母构成的列号: 第27列为AA,第28列为AB... ...

  5. SpringMVC访问静态资源的三种方式

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  6. php钩子原理和实现

    2017年3月18日17:22:52 php版本 5.6.27 5.3以下和5.3以上的版本在PHP类与对象区别很大,请注意 其实原理很简单,有些人把事情弄的过于发杂,其实就是调用某个目录下的比如/h ...

  7. c++求最小公倍数和最小公约数

    方法一:辗转相除法(欧几里得 Euclidean) 用“较大数”除以“较小数”,再用较小数除以第一余数,再用第一余数除以第二余数: 反复直到余数为零为止. #include<iostream&g ...

  8. ffmpeg命令的使用

    参考博客:https://www.cnblogs.com/wainiwann/p/4128154.html 但是红色网页总结的 “ffmpeg 用法” 非常全面. http://www.360doc. ...

  9. unity 安装破解提示partern not found和tutorials学习

    1.破解安装问题:unity 安装破解提示partern not found 可能和安装了多个版本有关,删除了c下的unity目录也没有解决,试着重新安装也不能破解, 破解的软件的方式是生成lisen ...

  10. 小程序movable-area置于顶层遮盖下方元素无法操作的解决方案

    小程序项目中有个需求,右下角按钮可以在页面中随意拖动,此时查看文档找到了一个自带的标签可以实现此功能,代码如下 <movable-area> <movable-view x=&quo ...