python类中的变量范围

时间:2011-04-17 01:37:01

标签: python scope

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

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

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

并且因为没有私有/受保护,所以一切都是公共的,所以从类内可以访问的所有内容都可以从类外部访问。

我是否应该知道其他细微差别,或者我几乎得到了它?

5 个答案:

答案 0 :(得分:101)

由于你的问题中的列表并非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'

一开始,ab只是为类本身定义的变量 - 可通过Test.aTest.b访问,而不是特定于任何实例。

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

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

答案 1 :(得分:20)

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

您可以使用下划线实现某种级别的访问控制。见private variables in the Python tutorial。按照惯例,变量以一个下划线开头,例如_foo是API的非公开部分,名称以两个下划线开头,例如__foo将其名称​​ mangled 设为_classname__foo

答案 2 :(得分:-1)

我们可以在其中将范围用作: 情况1:在班上
class test:<br> def __init__(self, a): self.__elements = a<br> def change_a(self): self.__elements = 5

情况2:外部课程
t = test(5)

这将作为对象进行访问。_classname__privatevaribalename

print(t._test__elements)

这将打印a`的更改值。

答案 3 :(得分:-1)

尽管回答了,但让我在您的问题中添加一些评论:

在类中声明一个变量(在函数外部):所有类函数都可以访问它(基本上是一个公共变量): comment:这就像一个静态变量,可以使用类名来调用。这些变量可用于所有功能,任何功能都可以对其进行修改和打印。

在类内的函数内声明变量:只有该函数才能访问它(在该函数范围内): 注释:如果声明的变量不带self,则只能在该函数中访问,即局部变量。但是,如果使用self.var ='somevalue'这样的self进行声明,则可以通过任何对象但不能通过类名对其进行访问。

在类内的函数内声明一个带有self。(变量名)的变量:所有类函数都可以访问它(这与全局变量(变量名)有何不同?): 评论:请参阅上面的部分。

并且由于没有私有/受保护的,所以一切都是公共的,因此可以从类外部访问所有可以从类内部访问的东西: 评论:是的,但是我们可以使用单个下划线告诉世界这个变量是私有的,但是从技术上讲,实际上并没有将其设为私有。

答案 4 :(得分:-1)

类测试:     a =无     b =无

def __init__(self, a):
    print self.a
    self.a = a
    self._x = 123
    self.__y = 123
    b = 'meow'

这对我有用。感谢ThiefMaster