Difference between “__method__” and “method”
有没有或出于某种随机的原因,人们认为
__method :私有方法。__method__ :特殊的python方法。它们是这样命名的,以防止名称冲突。请检查此页以获取这些特殊方法的列表。_method :这是《Python样式指南》中受保护方法的推荐命名约定。
从样式指南:
_single_leading_underscore : weak"internal use" indicator. E.g.from M does not import objects whose name starts with an underscore.
import *
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 classFooBar , __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 ,这通常意味着您已经自己编写了方法。 __method 2个下划线用于防止名称损坏。这样的属性或方法可以通过instance._ClassName__method 访问。虽然很多人称之为"私人",但事实并非如此。您不应该使用它来阻止某人访问此方法,而是使用_method 。__method__ 用于修改实例行为的特殊方法。不要这样命名自己的方法。
这些都是惯例,所以无论如何都不会强制执行。不过,您通常可以期望:
1 | __somename__ |
在Python语言规范本身中定义的东西。不要在自己的命名中使用这个。
1 | _somename |
这通常应该通过一些不同的机制来调用,而不是直接调用。类似于在大多数其他语言中声明某种私有的东西,但不以任何方式强制执行。
1 | __somename |
这真的不应该被直接调用,而是在内部被破坏以阻止您这样做。如果出于某种原因确实需要调用它,请查看文档以了解如何调用。
上面的任何一个都可以同样地应用于函数、变量或类名。
这些方法的命名是为了减少命名冲突的可能性。
1 2 3 4 | str(x) -> x.__str__() repr(x) -> x.__repr__() x[0] -> x.__getitem__(0) etc |
一个下划线前缀表示一个私有属性,并且只遵循约定。
双下划线前缀启动名称管理,名为"属性"的属性在实例化时更改为"类"。
你所拥有的"方法"模式并没有真正用于任何事情。
一些带有双下划线前缀和后缀的方法是特殊的。例如,每当创建该类的实例时,都会调用
我不知道双下划线全局函数(不属于任何类),但我认为没有。
以双下划线作为前缀的方法通常标记为表示它们是Python语言规范的一部分。