关于python:”方法”和”方法”的区别

Difference between “__method__” and “method”

本问题已经有最佳答案,请猛点这里访问。

__method__method_method__有什么区别?

有没有或出于某种随机的原因,人们认为__doc__应该是正确的,而不是doc。是什么使一种方法比另一种方法更特殊?


  • __method:私有方法。
  • __method__:特殊的python方法。它们是这样命名的,以防止名称冲突。请检查此页以获取这些特殊方法的列表。
  • _method:这是《Python样式指南》中受保护方法的推荐命名约定。

从样式指南:

  • _single_leading_underscore: weak"internal use" indicator. E.g. from M
    import *
    does not import objects whose name starts with an underscore.

  • single_trailing_underscore_: used by convention to avoid conflicts with
    Python keyword, e.g.

    1
    Tkinter.Toplevel(master, class_='ClassName')
  • __double_leading_underscore: when naming a class attribute, invokes name
    mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).

  • __double_leading_and_trailing_underscore__:"magic" objects or
    attributes that live in user-controlled namespaces. E.g. __init__,
    __import__ or __file__. Never invent such names; only use them
    as documented.


  • method只是一种正常的方法
  • 除非您知道自己在做什么,否则不应调用_method,这通常意味着您已经自己编写了方法。
  • __method2个下划线用于防止名称损坏。这样的属性或方法可以通过instance._ClassName__method访问。虽然很多人称之为"私人",但事实并非如此。您不应该使用它来阻止某人访问此方法,而是使用_method
  • __method__用于修改实例行为的特殊方法。不要这样命名自己的方法。


这些都是惯例,所以无论如何都不会强制执行。不过,您通常可以期望:

1
__somename__

在Python语言规范本身中定义的东西。不要在自己的命名中使用这个。

1
_somename

这通常应该通过一些不同的机制来调用,而不是直接调用。类似于在大多数其他语言中声明某种私有的东西,但不以任何方式强制执行。

1
__somename

这真的不应该被直接调用,而是在内部被破坏以阻止您这样做。如果出于某种原因确实需要调用它,请查看文档以了解如何调用。

上面的任何一个都可以同样地应用于函数、变量或类名。


这些方法的命名是为了减少命名冲突的可能性。


__name__的模式表示"魔法"方法。这些是由各种函数调用的,例如

1
2
3
4
str(x) -> x.__str__()
repr(x) -> x.__repr__()
x[0] -> x.__getitem__(0)
etc

一个下划线前缀表示一个私有属性,并且只遵循约定。

双下划线前缀启动名称管理,名为"属性"的属性在实例化时更改为"类"。

你所拥有的"方法"模式并没有真正用于任何事情。


一些带有双下划线前缀和后缀的方法是特殊的。例如,每当创建该类的实例时,都会调用__init__,而在打印对象时调用__str__。基本上,它们可以以特殊的方式被调用。您可以像其他任何方法一样使用它们,也可以通过与它们相关联的特殊方式调用它们。

我不知道双下划线全局函数(不属于任何类),但我认为没有。


以双下划线作为前缀的方法通常标记为表示它们是Python语言规范的一部分。