使用变量和方法的Underscore vs Double下划线

时间:2011-08-03 16:52:14

标签: python

有人很好地向我解释__method()破坏了,但由于还有很多其他人需要帮助而没有进一步打扰他,我想知道是否有人可以进一步阐述这些差异。

例如我不需要修改但是保持私有所以有人不能做instance._method()?或者它是否只是通过使其独一无二来覆盖另一个变量?我不需要我的内部方法“隐藏”,但因为它们是特定的使用我不希望它们在课外使用。

3 个答案:

答案 0 :(得分:223)

来自PEP 8

  
      
  • _single_leading_underscore:弱“内部使用”指标。 E.g。

         

    from M import *

         

    不会导入名称以下划线开头的对象。

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

         

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

  •   
  • __double_leading_underscore:在命名类属性时,调用name     mangling(在课堂FooBar内,__boo成为_FooBar__boo;见下文)。

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

另外,来自David Goodger的Code Like a Pythonista

  

属性:interface_internal__private

     

但请尽量避免使用__private表单。我从不使用它。相信我。如果你   使用它,你会后悔的。

     

说明:

     

来自C ++ / Java背景的人特别容易受到影响   过度使用/滥用此“功能”。但__private名称不起作用   与Java或C ++相同。他们只是触发了一个名字错误的人   目的是防止子类中的意外命名空间冲突:   MyClass.__private只是MyClass._MyClass__private。 (注意   甚至这会破坏与子名相同的子类   超类,例如不同模块中的子类。)有可能   从课堂外访问__private名称,只是不方便   脆弱的(它增加了对超类的确切名称的依赖)。

     

问题在于,一个班级的作者可以合理地认为“这个   属性/方法名称应该是私有的,只能从内部访问   这个类定义“并使用__private约定。但后来,   该类的用户可以创建合法需要的子类   访问该名称。所以要么必须修改超类   (可能很难或不可能),或子类代码必须   使用手动损坏的名称(最好是丑陋和脆弱)。

     

Python中有一个概念:“我们都是在这里同意成年人”。如果   您使用__private表单,谁保护该属性?   子类的责任是使用来自的属性   正确的超类,超类的责任   正确记录他们的属性。

     

最好使用单引导下划线约定,   _internal。 “这根本不是名字错误;它只是表明了   其他人“要小心这一点,这是一个内部实施   详情;如果你不完全理解它,请不要碰它。“它只是一个   但是会议。

答案 1 :(得分:111)

单个前导下划线只是一种惯例,意思是“你可能不应该使用它”。它没有阻止某人使用该属性。

双引导下划线实际上会更改属性的名称,以便继承层次结构中的两个类可以使用相同的属性名称,并且它们不会发生冲突。

答案 2 :(得分:11)

Python中没有访问控制。您可以访问类的所有属性,包括错位名称(如_class__variable)。专注于您的代码和API,而不是试图保护开发人员自己。