Python中单下划线与双下划线命名规范详解
本文详解Python中变量与函数命名时单下划线和双下划线的特殊含义。双下划线开头触发名称修饰机制实现私有化,防止子类覆盖;前后双下划线用于魔术方法;单下划线仅作为约定提示私有,不影响实际访问。
Python的代码风格规范由PEP 8文档定义。该文档详细阐述了Python编程的各种风格准则。遵循这些准则,不同开发者编写的Python代码能保持高度的风格一致性,从而提升代码的可读性,并促进程序员之间的协作与交流。
Python中的标识符允许包含数字、字母以及下划线,但必须以字母或下划线开头。通常,以下划线开头的命名具有特定的语义含义。
前后均带有双下划线(__)的命名
此类命名通常用于特殊方法,旨在实现对象的具体行为或功能。例如,__new__()方法用于创建实例,__init__()方法用于初始化对象。
Python将运算符操作映射为对应的魔术方法。例如,x + y操作被映射为调用x.__add__(y);序列或字典的索引操作x[k]映射为x.__getitem__(k);内置函数len()和str()分别调用__len__()和__str__()方法。
仅开头带有双下划线(__)的命名
这种命名方式用于对象的数据封装。以此命名的属性或方法被视为类的私有属性或私有方法。
class Foo(object):
def __init__(self):
self.__name = 'private name'
def getname(self):
return self.__name
def __spam(self):
print 'private method'
def bar(self):
self.__spam()
如果在类外部直接访问这些私有属性或方法:
>>> f = Foo() >>> f.__name Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> f.__name AttributeError: 'Foo' object has no attribute '__name' >>> f.__spam() Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> f.__spam() AttributeError: 'Foo' object has no attribute '__spam'
这是不可行的,从而实现了数据的隐藏。然而,这种封装机制并非绝对严格,它是通过自动“名称修饰”实现的。类中所有以双下划线开头的名称__name都会自动转换为“_类名__name”的新形式:
>>> f._Foo__name 'private name' >>> f._Foo__spam() private method
通过这种转换后的名称即可访问。
这种机制可以防止子类重新定义或更改父类方法的实现。例如,定义一个继承自Foo的派生类Goo:
class Goo(Foo):
def __spam(self):
print 'private method of Goo'
在Goo中重写__spam方法,运行代码:
>>> g = Goo() >>> g.bar() private method
当调用bar()方法时,依然执行的是Foo类中的__spam()方法。这是因为在bar()方法的实现中,self.__spam()已被自动转换为self._Foo__spam(),而Goo继承的bar()方法也遵循此逻辑。
以单下划线(_)开头的命名
此类命名通常用于模块中的“私有”定义。
使用from module import *语句加载模块时,会导入模块中的所有名称。为了控制导入的内容,一种方法是定义__all__列表,只有__all__中列出的名称才能通过*导入,
另一种方法是以单下划线开头命名定义,这类定义不会被*导入语句自动加载。
当然,在类中也可以使用单下划线开头来命名属性或方法。这仅表示类的定义者希望这些成员是“私有的”,但实际上并不会对访问权限产生任何限制作用。
总结
以上即为关于Python中带下划线变量或函数命名的完整解析,希望有所帮助。感兴趣的朋友可继续参阅本站其他相关专题,如有不足之处,欢迎留言指正。感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













