Python 变量名 __ 和 _ 以及 @property 语法以及声明位置

Bra*_*Deo 2 python python-2.7 python-3.x

我对一些事情有点困惑。

  1. 何时以及如何使用以单下划线_和双下划线开头的变量名。__

  2. 什么时候应该@property使用标签

  3. 变量何时应在 init 方法外部声明,何时应在 init 方法内部声明?

下面是一个代码示例,展示了示例用法(可能会被错误使用)。

class GenClass(object):
    _variable1 = None
    __variable2 = None

    @property
    variable3 = None

    def __init__(self, v4):
        self.variable4 = v4
Run Code Online (Sandbox Code Playgroud)

所有这些有什么区别?它们看起来很隐晦,肉眼看起来是一样的,但我已经开始注意到它们都是不同的。

dec*_*eze 5

  1. ___在变量/属性名称的开头表示该属性应该分别是“受保护的”或“私有的”,并且不应被同一类/模块之外的代码触及。__触发一些实际的轻名称修改,以真正防止与继承类的名称冲突,但最终两者都只是向程序员暗示预期用法的约定。如果变量不是“您的”,请不要触摸_它,因为作者不保证该属性将始终存在和/或始终有用。

  2. @property当您想要在访问属性时执行方法(而不是直接访问普通属性)时,应该使用。这有多种用途,包括计算/虚拟属性(在读取属性时计算值)和强制只读属性:

    @property
    def foo(self):
        '''Can read, but can't write to .foo'''
        return 'bar'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在类上声明属性会使该属性在该类的所有实例中都相同。将其声明为 onself使其特定于该实例。通常你想要后者。