在本文中,我将讨论常见的几种下划线模式和命名约定,以及它们如何影响Python程序的行为:
单前导下划线:_var:
(“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量。)
当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。 它是对程序员的一个提示 - 意味着Python社区一致认为它应该是什么意思,但程序的行为不受影响。
下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅供内部使用。 该约定在PEP 8中有定义。
这不是Python强制规定的。 Python不像Java那样在“私有”和“公共”变量之间有很强的区别。 这就像有人提出了一个小小的下划线警告标志,说:
“嘿,这不是真的要成为类的公共接口的一部分。不去管它就好。“
单后导下划线:_var:
单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。 PEP 8解释了这个约定
双前导下划线:__var
双前导和末尾下划线:var
“双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据
image.pngpython中以双下划线的是一些系统定义得名称,让python以更优雅得语法实行一些操作,本质上还是一些函数和变量,与其他函数和变量无二。
比如x.add(y) 等价于 x+y
有一些很常见,有一些可能比较偏,在这里罗列一下,做个笔记,备忘。
x.contains(y) 等价于 y in x, 在list,str, dict,set等容器中有这个函数
base, bases, mro, 关于类继承和函数查找路径的。
class.subclasses(), 返回子类列表
x.call(...) == x(...)
x.cmp(y) == cmp(x,y)
x.getattribute('name') == x.name == getattr(x, 'name'), 比getattr更早调用
x.hash() == hash(x)
x.sizeof(), x在内存中的字节数, x为class得话, 就应该是x.basicsize
x.delattr('name') == del x.name
dictoffset attribute tells you the offset to where you find the pointer to the dict object in any instance object that has one. It is in bytes.
flags, 返回一串数字,用来判断该类型能否被序列化(if it's a heap type), flags & 512
S.format, 有些类有用
x.getitem(y) == x[y], 相应还有setitem, 某些不可修改类型如set,str没有setitem
x.getslice(i, j) == x[i:j], 有个疑问,x='123456789', x[::2],是咋实现得
subclasscheck(), check if a class is subclass
instancecheck(), check if an object is an instance
itemsize, These fields allow calculating the size in bytes of instances of the type. 0是可变长度, 非0则是固定长度
x.mod(y) == x%y, x.rmod(y) == y%x
x.module , x所属模块
x.mul(y) == xy, x.rmul(y) == yx
reduce, reduce_ex , for pickle
slots 使用之后类变成静态一样,没有了dict, 实例也不可新添加属性
getattr 在一般的查找属性查找不到之后会调用此函数
setattr 取代一般的赋值操作,如果有此函数会调用此函数, 如想调用正常赋值途径用 object.setattr(self, name, value)
delattr 同setattr, 在del obj.name有意义时会调用
网友评论