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

__method__method_method__ 有什么区别?

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

【问题讨论】:

    标签: python methods


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      来自风格指南:

      • _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 语言规范的一部分。

              【讨论】:

                猜你喜欢
                • 2016-05-25
                • 2018-09-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-10-05
                • 2013-01-21
                • 1970-01-01
                • 2013-07-10
                相关资源
                最近更新 更多