python中的成员或类变量

Joh*_*ohn 5 python variables

我来自Java,所以我在这里感到困惑.

class Sample(object):
    x = 100                     # class var?
    def __init__(self, value):
        self.y = value          # instance var?
        z = 300                 # private var? how do we access this outside Sample?
Run Code Online (Sandbox Code Playgroud)

3变量声明有什么区别?

var*_*tec 23

class Sample(object):
    x = 100      
    _a = 1
    __b = 11               
    def __init__(self, value):
        self.y = value      
        self._c = 'private'    
        self.__d = 'more private'
        z = 300         
Run Code Online (Sandbox Code Playgroud)

在这个例子中:

  • x 是类变量,
  • _a 是私有类变量(通过命名约定),
  • __b 是私有类变量(由解释器修改),
  • y 是实例变量,
  • _c 是私有实例变量(通过命名约定),
  • __d 是私有实例变量(由解释器修改),
  • z__init__方法范围内的局部变量.

如果名称中有单个下划线,则严格来说是一种约定.仍然可以访问这些变量.如果是双下划线名称,它们会被破坏.它仍然可以规避这一点.

  • 但是,dunderscore在Python中很少使用.通常只需要一个下划线来表示该变量是供内部使用的. (4认同)
  • [PEP 8]的相关引用(http://www.python.org/dev/peps/pep-0008/#method-names-and-instance-variables):"仅对非公开方法使用一个前导下划线实例变量.为了避免与子类的名称冲突,使用两个前导下划线来调用Python的名称修改规则." 它并不比单个下划线更私密*. (4认同)
  • @vartec:_enforced_在这里是一个强有力的词.这真的只是名字错了. (3认同)
  • @John:不,dunderscore导致解释器启用名称修改,请参阅链接.但它们具有相同的意图:将变量标记为内部使用. (2认同)