“__method__”和“方法”之间的区别

时间:2009-06-01 15:42:32

标签: python methods

__method__method_method__之间有什么区别?

是否存在任何或一些随机原因的人认为__doc__应该是正确的,而不是doc。什么使一种方法比另一种方法更特殊?

7 个答案:

答案 0 :(得分:75)

来自风格指南:

  
      
  • _single_leading_underscore:弱“内部使用”指标。例如。 from M import *不会导入名称以下划线开头的对象。

  •   
  • single_trailing_underscore_:由惯例用于避免与之冲突     Python关键字,例如

    Tkinter.Toplevel(master, class_='ClassName')
    
  •   
  • __double_leading_underscore:在命名类属性时,调用name     修改(在课堂FooBar内,__ boo变为_FooBar__boo;见下文)。

  •   
  • __double_leading_and_trailing_underscore__:“魔法”物品或     存在于用户控制的命名空间中的属性。例如。 __init__,    __import____file__。不要发明这样的名字;只使用它们     记录在案。

  •   

答案 1 :(得分:19)

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

答案 2 :(得分:4)

这些都是惯例,因此无论如何都不会强制执行。不过,你通常可以期待:

__somename__

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

_somename

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

__somename

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

以上任何一项都可以同样适用于函数,变量或类名。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

str(x) -> x.__str__()
repr(x) -> x.__repr__()
x[0] -> x.__getitem__(0)
etc

单个下划线前缀用于表示私有属性,并且仅遵循约定。

双下划线前缀启动名称修改,其中名为__attr的属性在实例化时更改为__Class_attr。

你对_method__的模式并没有真正用于任何事情。