python中单双下划线的区别对比分析
作者:WTIAW.TIAW 发布时间:2023-12-18 23:58:45
区别:
xx:公有变量,所有对象都可以访问;
xxx:双下划线代表着是系统定义的名字。
__xxx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问。代表着类中的私有变量名。
_xxx:单前置下划线,私有化属性和方法,类对象和子类可以访问。不能用“from module import *”导入。
xx_:单后置下划线,用于避免与python关键字的冲突。
Python中存在一些特殊的方法,有些方法以双下划线 “__” 开头和结尾,它们是Python的魔法函数,比如__init__()和__str__等等。不用要这种方式命名自己的变量或者函数。
示例代码:
class Test(object):
def __init__(self, text):
self.text = text
def __str__(self):
return self.text
text = input("Please input text:")
obj = Test(text)
print(obj)
运行结果:
在前面加上“__”,表示它是私有成员,我们不能直接访问。比如 “__xxx” 如果要访问得通过 _class__xxx 的方式进行访问。虽然不能防止修改私有属性,但可以有效降低有意或者无意的修改。
示例代码:
class Test(object):
def __init__(self, text):
self.__text = text
self.__text2 = text
def func(self):
print(self.__text)
def __str__(self):
return self.__text
text = input("Please input text:")
obj = Test(text)
print(obj)
obj.func()
# print(obj.__text) # 报错
print(obj._Test__text)
print(dir(obj))
运行效果:
从图中可以看到双下划线开头的变量,Python自动在前面加上了 “_class” 的前缀,所以我们访问时也要加上相应的前缀才能正常访问。
_xxx:一种约定,用来指定变量私有。程序员用来指定私有变量的一种方式。不能用from module import * 导入,其他方面和公有一样访问。
示例代码:
# test.py
class Test1(object):
def __init__(self):
self.text = "my is text!"
def __str__(self):
return self.text
class _Test2(object):
def __init__(self):
self.text = "my is text2!"
def __str__(self):
return self.text
if __name__ == '__main__':
obj1 = Test1()
obj2 = _Test2()
print(obj1)
print(obj2)
可以通过别的方式访问这个类,修改我们的test2.py文件为以下内容。
# test2.py
import test
obj1 = test.Test1()
print(obj1)
obj2 = test._Test2()
print(obj2)
除了不能通过 from module import * 这种方式导入外,跟公有类并没有差别。
运行效果:
__sizeof__() : 打印系统分配空间的大小。
示例代码:
class Test(object):
def __init__(self):
self.__text = "my is text!"
def func(self):
print(self.__text)
def __str__(self):
return self.__text
obj = Test()
print(obj)
print(dir(obj))
print("*" * 100)
print(obj.func.__sizeof__())
print(obj.func.__sizeof__)
print("*" * 100)
print(obj.func().__sizeof__)
print(obj.func().__sizeof__())
运行结果:
__name__:前面和后面加上下划线代表着是系统定义的名字。普通变量不能使用此方式来命名。__name_表示当前模块执行过程中的名称,如果该模块执行,则__name__的值为__main_,如果模块是被导入的,则__name__的值为被导入的模块的模块名字。
__main__:表示整个工程开始运行的入口。
示例代码:
# test_name.py
def func():
if __name__ == '__main__':
print("my name is %s" % __name__) # my name is __main__
else:
print("It's me: %s" % __name__) # It's me: test_name
if __name__ == '__main__':
func() # my name is __main__
# 在其它文件中
# test_name2.py
import test_name
test_name.func() # It's me: test_name
来源:https://blog.csdn.net/weixin_43960370/article/details/130256967


猜你喜欢
- 301和302 Http状态有啥区别?301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:301 redir
- 概述从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类
- 今天项目上遇到一个问题,需要在点击a标签时,将完整的内容显示出来原先是想用jquery的click方法<a ownattr=“……”
- vue+element表格实现多层数据嵌套今天用element的表格渲染了商城的购物车列表,element的表格之前也用到过,它把所有的东西
- 前言mysql查询使用select命令,配合limit,offset参数可以读取指定范围的记录。本文将介绍mysql查询时,offset过大
- 执行数据库更新update操作的时候数据库卡死了问题分析一般都是数据库事务未提交,导致update或者delete卡死。解决办法在执行完更新
- 这篇文章主要介绍了mysql数据迁徙方法工具解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- python数组和矩阵先创建一个一维数组直接定义一个数组:a = [1,2,3,4,5]b = ['a','c
- 本文实例讲述了JS将滑动门改为选项卡(需鼠标点击)的实现方法。分享给大家供大家参考。具体如下:大家都知道,滑动门和选项卡在布局和结构方面几乎
- 前言我想大家都玩过诺基亚上面的贪吃蛇吧,本文将带你一步步用python语言实现一个snake小游戏。基本环境配置版本:Python3系统:W
- python爬虫写起来非常快,虽然也可以用java,但是没有python来的简
- 我的需求:手动配置X轴、Y轴、图表标题等参数自动通过Pyecharts模块生成可视化的html数据图表,并将浏览器图表展示到UI界面上。制作
- python自带的IDLE使用起来非常方便,尤其是在编写调试小段代码的时候,但是安装了Anaconda的同志可能会发现,无法像直接安装pyt
- 前言;Python是一种非常具有表现力的语言,它提供了不同的结构来简化开发人员的工作。 该列表是python提供的最受欢迎的数据结构之一。
- 0. 简介上一篇博客简单介绍了GMP模型,这一篇我们介绍一下Go调度器的初始化过程,也就是在main.main函数运行之前所做的事情。1.
- dictPython内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)
- 记录一下Linux虚拟机下MySQL安装配置方法一、 下载mysql5.7http://mirrors.sohu.com/mysql/MyS
- 上篇博客转载了关于感知器的用法,遂这篇做个大概总结,并实现一个简单的感知器,也为了加深自己的理解。感知器是最简单的神经网络,只有一层。感知器
- 如下所示:update-alternatives --config python一条简单的命令,如下图所示:来源:https://blog.
- INSERT INTO hk_test(username, passwd) VALUES('qmf1', 'qmf1