我想知道Python中这些有什么区别?
self._var1
self._var1_
self.__var1
self.__var1__
Run Code Online (Sandbox Code Playgroud)
Mar*_*ery 68
作为起点,您可能会从PEP 8 - Python指南样式指南中找到有用的引用:
此外,还会识别使用前导或尾部下划线的以下特殊形式(这些形式通常可与任何案例约定结合使用):
_single_leading_underscore:弱"内部使用"指标.例如from M import *,不会导入名称以下划线开头的对象.
single_trailing_underscore_:用于避免与Python关键字冲突的约定,例如Tkinter.Toplevel(master, class_='ClassName')
__double_leading_underscore:当命名一个类属性时,调用名称修改(在类FooBar中,__boo变为_FooBar__boo;见下文).
__double_leading_and_trailing_underscore__:生成在用户控制的命名空间中的"魔术"对象或属性.例如__init__,__import__或__file__.不要发明这样的名字; 只记录使用它们.
但是,您在类属性的上下文中询问过,让我们来看看您的具体示例:
在类中命名属性向类self._var1的用户指示该属性只能由类的内部(或者可能是子类的内部)访问,并且它们不需要直接访问它,并且可能不应该修改它.您应该在Java或C#中使用private或protected字段的相同位置使用前导下划线,但要注意该语言实际上并不强制执行非访问 - 相反,您相信您的类的用户不会做任何愚蠢的事情,并离开他们可以选择访问(或修改)你班级的私人领域,如果他们真的,他们确实知道他们正在做什么,这是有道理的.
self._var1_不是我见过的东西.我认为这种命名风格在Python世界中没有任何常规含义.
这个实际上具有句法意义.参照self.__var1从你的类的范围内调用名字改编.从您的课外,变量将显示为self._YourClassName__var1而不是self.__var1.不是每个人都使用这个 - 我们根本不在工作的地方 - 而对于简单的课程来说,使用单个前导下划线感觉有点荒谬和恼人.
但是,它有理由存在; 如果你使用大量的继承,如果你只使用单个前导下划线,那么你没有办法向某人读取你的代码中"私有"和"受保护"变量之间的区别 - 那些甚至都不是要由子类访问,以及子类可以访问但外部世界可能不访问的子类.因此,在这种情况下,使用单个尾部下划线表示"受保护"和双下划线表示"私有"可能是一个有用的约定(并且名称修改将允许子类在其子类中使用具有相同名称的变量而不会导致碰撞).
self.__var1__因为双字母和尾部下划线命名样式仅用于具有Python定义的特殊含义的名称,例如类__init__或__eq__方法,所以你应该永远不会创建它.你可以自由地覆盖那些改变你的类的行为(事实上,几乎所有的类都有一个程序员定义的__init__),但是你不应该用这种风格来组建你自己的名字self.__var1__.
| 归档时间: |
|
| 查看次数: |
16935 次 |
| 最近记录: |