Python 区别于__方法;及;方法“;

Python 区别于__方法;及;方法“;,python,methods,Python,Methods,方法与方法与方法之间有什么区别 是否有任何或出于某种随机原因,人们认为\uuu doc\uuu应该是正确的,而不是doc。是什么使一个方法比另一个方法更特殊?以双下划线开头和前缀的方法通常被标记,以表明它们是Python语言规范的一部分。这些方法的命名是为了减少命名冲突的可能性。 \u方法:私有方法 \uuuu方法\uuuu:特殊的Python方法。它们这样命名是为了防止名称冲突 \u method:这是中受保护方法的推荐命名约定 从样式指南中: \u单个\u前导\u下划线:弱“内部使用”指

方法与
方法与
方法之间有什么区别


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

以双下划线开头和前缀的方法通常被标记,以表明它们是Python语言规范的一部分。

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

  • \u方法
    :私有方法
  • \uuuu方法\uuuu
    :特殊的Python方法。它们这样命名是为了防止名称冲突
  • \u method
    :这是中受保护方法的推荐命名约定
从样式指南中:

  • \u单个\u前导\u下划线
    :弱“内部使用”指示器。例如,来自M的
    
    导入*
    不导入名称以下划线开头的对象

  • 单尾随下划线:按惯例使用,以避免与
    Python关键字,例如

    Tkinter.Toplevel(master, class_='ClassName')
    
  • \uuuuuuuuuuuuuuuuuuu前导下划线
    :命名类属性时,调用name 损坏(在类内
    FooBar
    ,\uuuboo变为
    \ufoobar\uuboo
    ;见下文)

  • \uuuuu双\u前导\u和尾随\u下划线\uuuuuuu
    :“魔法”对象或 位于用户控制的名称空间中的属性。例如,
    \uuuuu init\uuuu
    \uuuu导入\uuuu
    \uuuu文件\uuuu
    。永远不要捏造这样的名字;只使用它们 如文件所述


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


我不知道双下划线全局函数(不属于任何类),但我认为没有。这些都是约定,因此无论如何都不会强制执行。不过,您通常可以预期:

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

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

__somename
这实际上不应该被直接调用,并且在内部被破坏以阻止您意外地这样做。如果您真的因为某种原因需要调用它,请查看文档以了解如何调用


上述任何一项都同样适用于函数、变量或类名。

模式
\uuuu name\uuuu
表示“神奇”方法。这些函数由各种函数调用,如

str(x) -> x.__str__()
repr(x) -> x.__repr__()
x[0] -> x.__getitem__(0)
etc
单个下划线前缀用于指示私有属性,仅在约定中使用

双下划线前缀启动名称混乱,在实例化时,名为_attr的属性更改为_Class_attr

你的“方法”模式并没有真正用于任何事情。

  • 方法
    只是一种普通方法
  • \u方法
    除非您知道自己在做什么,否则不应调用,这通常意味着您自己编写了该方法
  • \u方法
    两个下划线用于防止名称管理。这样的属性或方法可以通过
    实例进行访问。虽然很多人称之为“私人”,但事实并非如此。您不应使用此方法阻止他人访问此方法,请改用
    \u方法
  • \uuuu方法\uuuu
    用于修改实例行为的特殊方法。不要这样命名您自己的方法

\uu方法不是真正私有的,它与类名有冲突,但仍然可以正常访问+1尽管如此。@Bastien-谢谢你改进了格式-1.因为_x在面向对象的意义上不是私有的,这不是它的重点。关键是要避免两个类错误地使用相同的属性。它是命名空间处理,而不是私有/受保护。