python单双下划线用法详解
区别:
-
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
关于python所编写的代码与python底层实际调用的代码,详见:python中那些双下划线开头得函数和变量--转载 - nkwy2012 - 博客园
相关文章
- python操作redis用法详解
- python WSGI框架详解
- python 操作RabbitMq详解
- 详解用python实现简单的遗传算法
- Python中第三方库Requests库的高级用法详解
- Python中第三方库Requests库的高级用法详解
- Python中第三方库Requests库的高级用法详解
- Python中生成器和yield语句的用法详解
- Python回调函数用法实例详解
- python:pip升级pip本身和setuptools(Python 3.7.15)
- Python字符串类型详解(三)——字符串类型的格式化
- Python语言学习:在python中,如何获取变量的本身字符串名字而非其值/内容及其应用(在代码中如何查找同值的所有变量名)
- Python编程语言学习:包导入和模块搜索路径(包路径)简介、使用方法(python系统环境路径的查询与添加)之详细攻略
- Python之pandas:pandas中to_csv()、read_csv()函数的index、index_col(不将索引列写入)参数详解之详细攻略
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Entry/Entry的Command)
- python --> Python初阶 --> 基础语法 --> 条件和分支
- 已解决vscode配置原因运行Python读取文件报错
- 〖Python 数据库开发实战 - Python与Redis交互篇⑤〗- 利用 redis-py 实现哈希数据类型的常用指令操作
- 黑客这样使用python发邮件
- Python 实操案例:一文详解10种聚类算法
- Python中self用法详解
- Python 自带的 any() 函数--判断给定的可迭代参数 iterable 是否全部为 False
- 【华为机试真题详解 Python实现】最小施肥机能效【2023 Q1 | 100分】
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )
- python基础===八大排序算法的 Python 实现
- python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
- Python垃圾回收机制详解
- Python: openstack: nova 结果去除空格
- 【异常】前端ERR! stack Error: Can‘t find Python executable “python“, you can set the PYTHON env variable.
- Python学习笔记十一之一个简单的opencv阈值分割实例,求取圆度、轮廓椭圆拟合
- Python requests库使用详解
- Python numpy.transpose 详解