python里面单双下划线的区别详解
作者:WTIAW.TIAW 发布时间:2023-03-22 12:39:22
区别:
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


猜你喜欢
- 1.元组的概念Python中的元组和列表很相似,元组也是Python语言提供的内置数据结构之一,可以在代码中直接使用。元组和列表就像是一个孪
- 一、Python+unittest+requests+HTMLTestRunner 完整的接口自动化测试框架搭建_00——框架结构简解&nb
- 链表一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结
- Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下:Tkinter: Tkinter 模块(Tk 接口)是 P
- 【目标需求】查看某一个字符串是否为中文字符串【解决办法】def check_contain_chinese(check_str): for
- 1.用一个栈【python中可以用List】就可以解决,时间和空间复杂度都是O(n)# -*- coding: utf8 -*-# 符号表S
- <%Function BytesToBstr(body,Cset)dim objstreamset&n
- 普通方法:爬取梨视频import reimport timeimport randomimport requestsfrom lxml im
- ThinkPHP CURD方法的limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多。并且
- 上一篇中,我们已经打开了Django自带的用户认证模块,并配置了数据库连接,创建了相应的表,本篇我们将在Django自带的用户认证的基础上,
- 由于现在的博客是使用wordpress搭建,自己得经常修改过一些代码,但是修改第三方源码真的比较痛苦,于是决定计划开始使用React + N
- 1. 权限管理Casbin是用于Golang项目的功能强大且高效的开源访问控制库。1.1.1. 特征Casbin的作用:以经典{subjec
- 如何在win7+Python3.5的环境下安装成功scrapy?通过pip3 install Scrapy直接安装,一般会报错:error:
- 生活中,我们在登录微博,邮箱的时候,常常会碰到验证码。在工作时,如果想要爬取一些数据,也会碰到验证码的阻碍。本次试验将带领大家认识验证码的一
- 使用场景当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到gi
- 先给大家展示下效果图,如果大家感觉还不错,请继续参考实现思路详解。布局1.左右各一半(col-md-6)2.左侧登录框占左侧一半的10/12
- Python Queue模块Python中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易用,但是不小心
- 我们都知道当我们建立数据表(innodb或myisam)时,会生成相应的文件(如:MYD,MYI,frm) 在这里,我们探讨下使用frm文件
- 最近在研究Hacker News API时遇到一个HTTPS问题。因为所有的Hacker News API都是通过加密的HTTPS协议访问的
- 最近一直在做Dnn模块的开发,过程中碰到这么一个问题,需要同时插入N条数据,不想在程序里控制,但是SQL Sever又不支持数组参数.所以只