【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问
小编在最初使用上Python之后,就一发不可收拾,人生苦短、我用Python,不光是因为其优雅简洁,更是因为它强大的扩展性,特别是一些Python内置的私有属性,熟练地掌握之后使得在开发过程中更灵活、更高效,今天小编就细数一些常用的私有属性,希望能够帮助到新手朋友们。
Python的隐藏属性无处不在,内置的私有属性往往是双下划线开头,双下划线结尾,这里我们从模块到对象,由上往下的来列举常用的属性用法。
模块属性
1、__name__
当python文件被直接运行时,__name__的值为__main__,而当python文件以模块的形式被导入时,__name__的值为模块名
def say_hello():
print hello
if __name__ == __main__:
say_hello()
上面的代码是最为常见的__name__的使用方式,当文件中有上述代码后,直接运行脚本则会执行say_hello方法,通过import形式导入脚本文件时则不会执行say_hello。
2、__file__
在python模块中使用__file__来获取脚本所在的路径,但得到的是相对路径,若希望得到绝对路径可使用os.path.realpath(__file__)
3、__all__
__all__指定的是当包被import * 的时候, 哪些模块会被import进来
#test1.py
import os, sys
__all__ = [os]
#test2.py
from test1 import *
sys.path
ImportError: No module named sys
上述代码可以看出,本来导入test1模块时,os、sys也会被一并导入进来,但是__all__属性限定了只导入os,所以sys并没有被导入进来。
4、__path__
__path__指定了包的搜索路径,默认情况下只有一个元素, 就是当前包的路径, 修改__path__, 可以修改此包内的搜索路径,修改该属性类似于修改sys.path
类、实例属性
1、__class__
__class__属于实例的属性,直接指向该实例的类对象
class A(object):
pass
a = A()
a.__class__等同于A
2、__dict__
对象的属性字典,key为属性名,value为该属性的值
注:__dict__若被实例对象引用则列出实例对象的属性,若被类引用则列出类属性
class A():
def __init__(self):
self.x=1 #定义一个实例属性
y = 2 #定义一个类属性
a = A()
a.__dict__
{'x': 1}
A.__dict__
{'__doc__': None,
'__init__': function __main__.__init__
'__module__': '__main__',
'y': 2}
上述代码可以看出,实例对象a的__dict__属性只包含实例属性x,而类A的__dict__属性则包含了所有类属性
3、__slots__
__slots__限制了类中只能定义某些属性
class Test(object):
__slots__ = ['a']
test = Test()
test.a = 1
test.b = 1
AttributeError: 'Test' object has no attribute 'b'
__slots__限定了属性集只能包含'a',所以在定义属性'b'时报出错误。
4、__new__、__init__
继承自object的新式类才有__new__
__new__在实例被创建时调用,__init__在实例创建后的初始化时调用,所以先调用__new__,然后调用__init__
class A(object):
def __init__(self):
print init
def __new__(cls,*args, **kwargs):
print new %s%cls
return object.__new__(cls, *args, **kwargs)
A()
# 输出
new class '__main__.A'
init
__new__方法必须返回一个实例对象
5、__del__
相当于类的析构函数,当类对象被销毁前调用
class MyClass(object):
def __del__(self):
print hehe
a = MyClass()
del a
hehe
6、操作符类属性
__str__:str()或print时调用
__len__:len()时调用
__cmp__:cmp()时调用
__lt__,__gt__,__eq__:,,=时被调用
__add__,__sub__,__mul__,__div__:+、-、*、/时被调用
__getitem__,__setitem__,__delitem__:列表引用、设置、删除时被调用
这些操作符类属性是Python类的内置类方法,往往当需要重载操作符时重载相应的类方法即可。
7、自定义私有属性
在定义类属性时,若在该属性前加上__,则该属性被定义为私有属性,即该属性不可被外部直接引用,只能在类的内部使用
class A(object):
def __init__(self):
self.__a = 1
def func(self):
print self.__a
a = A()
a.func()
#输出
1
a.__a
#输出
AttributeError: 'A' object has no attribute '__a'
然而Python对__a这个属性做了什么呢?实际上该属性并不是不存在的,当在某个属性前加上两个下划线后,python自动将其所在的类名追加在属性前导致其拥有了新的属性名,也由此实现了该属性不可引用的假象
class A(object):
def __init__(self):
self.__a = 1
def func(self):
print self.__a
a = A()
a._A__a
#输出
1
好了,我们就讨论到这里,关于Python更多的编程技巧、知识我们后续会继续交流,也欢迎感兴趣的朋友们私信讨论。
【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问的更多相关文章
- python中那些双下划线开头得函数和变量--转载
Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __x ...
- python python中那些双下划线开头的那些函数都是干啥用用的
1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...
- python中那些双下划线开头得函数和变量
Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __x ...
- python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...
- (转)python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...
- Python中被双下划线包围的魔法方法
基本的魔法方法 __new__(cls[, ...]) 用来创建对象 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __i ...
- Python - Django - ORM 双下划线
id 字段: id__lt:id 小于,id__gt:id 大于 import os if __name__ == '__main__': # 加载 Django 项目的配置信息 os.environ ...
- django models的点查询/跨表查询/双下划线查询
django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...
- 巨蟒python全栈开发django8:基于对象和基于双下划线的多表查询
1.编辑删除&&多对多关系的其他方法 提交,数据,得到结果 查看运行 给编辑和删除,添加样式 我们点击删除,可以成功删除 打印sql语句的,在settings.py里边的配置 LOGG ...
随机推荐
- [LeetCode] 802. Find Eventual Safe States 找到最终的安全状态
In a directed graph, we start at some node and every turn, walk along a directed edge of the graph. ...
- 四、Spring中使用@Conditional按照条件注册Bean
以前其实是写过@Condtional注解的笔记的,这里附上链接: Spring中的@conditional注解 但已经忘记的差不多了,所以今天再重新学习下,可以互补着学习 @Contional:按照一 ...
- 第2/7Beta冲刺
1.团队成员 成员姓名 成员学号 秦裕航 201731062432(组长) 刘东 201731062227 张旭 201731062129 王伟 201731062214 2.SCRU部分 2.1各成 ...
- Windows常用命令的使用
3.Tracert Tracert命令用来显示数据包到达目标主机所经过的路径,并显示到达每个节点的时间.该诊断实用程序将包含不同生存时间 (TTL) 值的 Internet 控制消息协议 (ICMP) ...
- 【NOIP2017】宝藏 题解(状压DP)
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...
- String和Irreducible Polynomial(2019牛客暑期多校训练营(第七场))
示例: 输入: 4000010010111011110 输出: 00001001 0111 01111 0 题意:给出一个只含有0和1的字符串,找出一种分割方法,使得每个分割出的字符串都是在该字符串自 ...
- 使用PHP开发HR系统(4)
本节我们讲述如何引入页面框架来建立漂亮的主页. ============================================================================ ...
- FreeMarker 教程整理
Freemarker新手教程 http://blog.csdn.net/qq_23994787/article/details/77506980 FreeMarker教程整理 http://blo ...
- Java中关于Math的几个取整方法的区别
1.Math.ceil() 向上取整 System.out.println(Math.ceil(3.4)); //输出4 System.out.println(Math.ceil(3.7)); / ...
- php ajax生成excel并下载
目标:使用php,通过ajax请求的方式生成一个excel,然后下载. 思路:大致思路是发送一个ajax请求到后台,后台php处理后生成一个excel文件,然后把生成的文件放到一个临时目录,然后把文件 ...