python类中的变量范围

jas*_*son 48 python scope

声明类中的变量(在函数外部):所有类函数都可以访问它(基本上是一个公共变量)

在类中的函数内声明一个变量:只有该函数可以访问它(它在该函数范围内)

在类中的函数内声明一个带有self(变量名)的变量:所有类函数都可以访问它(这与全局(变量名)有什么不同?)

并且由于没有私有/受保护,所以一切都是公共的,因此可以从课堂外访问从课堂内部访问的所有内容.

我应该知道还有其他细微差别吗,还是我几乎得到了它?

Thi*_*ter 112

由于您的问题中的列表并非100%明确,我决定用一个简单的例子来解释它.它还包括一些__something你在列表中没有提到的变量.

class Test:
    a = None
    b = None

    def __init__(self, a):
        print self.a
        self.a = a
        self._x = 123
        self.__y = 123
        b = 'meow'
Run Code Online (Sandbox Code Playgroud)

在开始的时候,ab只对类本身定义的变量-通过访问Test.a,并Test.b和不针对任何实例.

创建该类的实例(导致__init__执行)时:

  • print self.a 找不到实例变量,因此返回类变量
  • self.a = a:a创建一个新的实例变量.这会影响类变量,因此self.a现在将引用实例变量; 访问您现在必须使用的类变量Test.a
  • 用于self._x创建新实例变量的赋值.它被认为"不是公共API的一部分"(又名保护),但从技术上讲,它没有不同的行为.
  • 用于self.__y创建名为的新实例变量的赋值_Test__y,即其名称被修改,除非您使用受损的名称,否则无法从类外部访问它.这可以用于"私人"变量.
  • 用于b创建局部变量的赋值.除了__init__函数之外,它不能从任何地方获得,因为它没有保存在实例,类或全局范围中.

  • 希望我可以给予+10赞成票!我已经谷歌了一个小时试图找出是否将'b ='meow'`保存到类,实例或__init__的本地函数.谢谢! (3认同)
  • @DavorJosipovic 有一种叫做 Python3 的东西。 (2认同)

Raf*_*ler 20

在类的顶层声明变量就像声明一个静态变量或类变量一样.使用self限定它是声明一个实例变量.可以通过类名(例如Class.x = 5)引用类变量来修改类变量,并且所有实例都将继承这些更改.实例变量是实例专用的,只能由该实例修改.

您可以使用下划线实现某种级别的访问控制.请参阅Python教程中的私有变量.按照惯例,变量开始与一个下划线,例如_foo是API的非公开部分,名称以两个下划线如__foo将它的名字错位_classname__foo.