python前面一个下划线_前面和后面带下划线的python属性有什么区别?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:

The meaning of a single- and a double-underscore before an object name in Python

我想知道这些在Python中的区别是什么?

self._var1

self._var1_

self.__var1

self.__var1__

可能重复:stackoverflow.com/questions/1301346/…和stackoverflow.com/questions/935378/…

作为一个起点,您可能会从PEP8-Python代码风格指南中找到有用的这句话:

In addition, the following special forms using leading or trailing

underscores are recognized (these can generally be combined with any

case convention):

_single_leading_underscore: weak"internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.

single_trailing_underscore_: used by convention to avoid conflicts

with Python keyword, e.g.

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

__double_leading_underscore: when naming a class attribute, invokes name mangling (inside class FooBar, __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.

不过,您是在类属性的上下文中询问的,所以让我们来看一下您的具体示例:单前导下划线

在类中命名一个属性self._var1向类的用户表明,该属性只能由类的内部(或子类的内部)访问,并且它们不需要直接访问它,也可能不应该修改它。你应该在相同的地方使用领先的下划线,你会在Java或C语言中使用EDCOX1 1或EDCOX1 2字段,但是要注意语言实际上并没有强制非访问——相反,你相信你的类的用户不做任何愚蠢的事情,并且让他们选择访问或修改你的类的私有字段。E真的,真的确定他们知道自己在做什么,这是有意义的。单前导和尾随下划线

我从来没有见过self._var1_这种东西。我认为这种命名风格在Python世界中没有任何传统意义。双前导下划线

这个词实际上具有句法意义。从类范围内引用self.__var1会调用名称管理。从类外部来看,变量似乎位于self._YourClassName__var1而不是self.__var1。不是每个人都用这个——我们根本不在我工作的地方——对于简单的类来说,它感觉像是一个稍微荒谬和恼人的选择,而不是使用一个前导下划线。

但是,它存在一个理由;如果您使用大量继承,如果您只使用一个前导下划线,那么您就没有办法向阅读您的代码的人指示"private"和"protected"变量之间的区别——那些甚至不打算被子类访问的变量,以及子类可能访问的变量。但外界可能不会。因此,在这种情况下,使用单个尾随下划线表示"受保护",使用双下划线表示"私有"可能是一种有用的约定(名称管理允许子类在其子类中使用具有相同名称的变量,而不会导致冲突)。双前导和尾随下划线

self.__var1__是您不应该创建的东西,因为双前导和尾随下划线命名样式仅用于具有Python定义的特殊含义的名称,如__init__或__eq__类方法。您可以自由地重写这些代码来更改类的行为(实际上,几乎所有类都有一个程序员定义的__init__),但是您不应该像self.__var1__那样使用自己的名字。

文件中也有详细说明。

"单个前导和尾随下划线":这在某些项目中用作用户可修改的特殊方法等价物的约定。例如,我们在Sage中使用它。我在别处也看到过,尽管我想不出一个现成的例子。

双前导下划线的最后三行应相反:单下划线=私有,双下划线=受保护

@阿米特梅里不,那完全是错误的。名称管理使得不可能使用双下划线方法作为保护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值