“__method__”和“方法”之间的区别[重复]

Posted

技术标签:

【中文标题】“__method__”和“方法”之间的区别[重复]【英文标题】:Difference between "__method__" and "method" [duplicate] 【发布时间】:2010-10-30 10:33:56 【问题描述】:

__method__method_method__ 有什么区别?

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

【问题讨论】:

【参考方案1】:

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

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

单下划线前缀表示私有属性,只遵循约定。

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

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

【讨论】:

【参考方案2】: __method:私有方法。 __method__:特殊的 Python 方法。它们这样命名是为了防止名称冲突。 Check this page for a list of these special methods. _method:这是Python style guide 中受保护方法的推荐命名约定。

来自风格指南:

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

single_trailing_underscore_:按惯例使用以避免与 Python 关键字,例如

Tkinter.Toplevel(master, class_='ClassName')

__double_leading_underscore:命名类属性时,调用名称 mangling(在 FooBar 类中,__boo 变为 _FooBar__boo;见下文)。

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

【讨论】:

__method 并不是真正的私有方法,它与类名混淆,但仍然可以正常访问。 +1 虽然。 @Bastien - 感谢您改进格式! -1。因为 __x 在 OOP 意义上不是私有的,这不是重点。关键是要避免两个类错误地使用相同的属性。它是命名空间处理,而不是私有/受保护的。【参考方案3】: method 只是普通方法 除非您知道自己在做什么,否则不应调用 _method,这通常意味着您自己编写了该方法。 __method 2 个下划线用于防止名称篡改。可以通过instance._ClassName__method 访问此类属性或方法。尽管很多人称其为“私人”,但它不是。您永远不应该使用它来阻止某人访问此方法,而是使用 _method__method__ 用于修改实例行为的特殊方法。不要这样命名自己的方法。

【讨论】:

【参考方案4】:

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

__somename__

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

_somename

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

__somename

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于“__method__”和“方法”之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++宏导致:“警告:未使用的变量“LOG__METHOD__”“

PHP之魔术常量

php 中 self 和 static 的区别

PHP魔术变量总结

与类有关的魔术常量

一些有用的容易忘记的函数总结。