__method__ 和 method 的区别
什么是 __method__
、method
和 _method__
之间的区别?
有没有什么特别的原因让人们觉得 __doc__
应该这样写,而不是 doc
?为什么某些方法看起来比其他方法更特别呢?
7 个回答
4
这些都是一些约定,所以并没有强制执行。不过,通常你可以期待:
__somename__
这是在Python语言规范中定义的内容。你自己命名的时候不要用这个。
_somename
通常应该通过其他方式来调用,而不是直接调用。这有点像在其他语言中声明某个东西是私有的,但并没有强制执行。
__somename
这个真的不应该被直接调用,内部会进行一些处理来防止你意外调用。如果你真的因为某种原因需要调用它,记得查看文档了解怎么做。
以上这些约定同样适用于函数、变量或类的名称。
23
下面是一些关于方法命名的简单解释:
method
就是一个普通的方法。_method
这个方法不应该随便调用,除非你知道自己在做什么。通常这意味着你是自己写的这个方法。__method
前面有两个下划线是为了防止名字被改动。像这样的属性或方法可以通过instance._ClassName__method
来访问。虽然很多人把它称为“私有”,但其实它并不是。你不应该用这个来阻止别人访问这个方法,应该用_method
。__method__
是用来定义一些特殊的方法,这些方法会改变实例的行为。不要把自己的方法命名成这样。
74
__method
: 私有方法。__method__
: 特殊的Python方法。这种命名方式是为了避免名字冲突。查看这个页面可以找到这些特殊方法的列表。_method
: 这是Python风格指南中推荐的保护方法命名方式。了解更多。
来自风格指南:
_single_leading_underscore
: 表示“内部使用”的弱指示符。例如,from M import *
不会导入名字以下划线开头的对象。
single_trailing_underscore_
: 按约定用于避免与Python关键字冲突,例如:Tkinter.Toplevel(master, class_='ClassName')
__double_leading_underscore
: 当给类属性命名时,会触发名字重整(在类FooBar
中,__boo
会变成_FooBar__boo
;见下文)。
__double_leading_and_trailing_underscore__
: “魔法”对象或属性,存在于用户控制的命名空间中。例如,__init__
、__import__
或__file__
。永远不要自己创造这样的名字;只在文档中使用它们。