__method__ 和 method 的区别

38 投票
7 回答
11507 浏览
提问于 2025-04-15 11:58

什么是 __method__method_method__ 之间的区别?

有没有什么特别的原因让人们觉得 __doc__ 应该这样写,而不是 doc?为什么某些方法看起来比其他方法更特别呢?

7 个回答

4

这些都是一些约定,所以并没有强制执行。不过,通常你可以期待:

__somename__

这是在Python语言规范中定义的内容。你自己命名的时候不要用这个。

_somename

通常应该通过其他方式来调用,而不是直接调用。这有点像在其他语言中声明某个东西是私有的,但并没有强制执行。

__somename

这个真的不应该被直接调用,内部会进行一些处理来防止你意外调用。如果你真的因为某种原因需要调用它,记得查看文档了解怎么做。

以上这些约定同样适用于函数、变量或类的名称。

23

下面是一些关于方法命名的简单解释:

  • method 就是一个普通的方法。
  • _method 这个方法不应该随便调用,除非你知道自己在做什么。通常这意味着你是自己写的这个方法。
  • __method 前面有两个下划线是为了防止名字被改动。像这样的属性或方法可以通过 instance._ClassName__method 来访问。虽然很多人把它称为“私有”,但其实它并不是。你不应该用这个来阻止别人访问这个方法,应该用 _method
  • __method__ 是用来定义一些特殊的方法,这些方法会改变实例的行为。不要把自己的方法命名成这样。
74

来自风格指南:

  • _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__。永远不要自己创造这样的名字;只在文档中使用它们。

撰写回答