Python 类中的变量范围

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

在类中的函数中声明一个变量: 只有该函数可以访问它(它在该函数的作用域中)

在类中的一个函数中声明一个包含 self.(variable name)的变量: 所有的类函数都可以访问它(这与 global (variable name)有什么不同?)

由于没有 private/protected,因此所有内容都是公共的,所以从类内部访问的所有内容都可以从类外部访问。

还有什么我需要知道的细节吗,还是我已经知道了?

89313 次浏览

在类的顶层声明变量就像声明静态变量或类变量一样。用“自我”来定义它就是在宣告一种实例变量。类变量可以通过引用类名(例如 Class.x = 5)来修改,所有实例都将继承这些修改。实例变量是实例的私有变量,只能由该实例修改。

可以使用下划线实现某种级别的访问控制。见 Python 教程中的私有变量。按照惯例,以一个下划线开头的变量(例如 _foo)是 API 的非公共部分,以两个下划线开头的名称(例如 __foo)将使其名称 血肉模糊_classname__foo

由于你的问题中的清单不是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没有找到实例变量,因此返回 class 变量
  • 创建了一个新的实例变量。这会隐藏 class 变量,因此 self.a现在会引用这个实例变量,要访问 class 变量,你现在必须使用 Test.a
  • 分配给 self._x的任务创建了一个新的实例变量。它被认为是“不属于公共 API 的一部分”(也就是受保护的) ,但是从技术上讲,它没有不同的行为。
  • self.__y的赋值创建了一个名为 _Test__y的新实例变量,也就是说,它的名称是错误的,因此除非你使用错误的名称,否则不能从类的外部访问它。这可以用于“私有”变量。
  • b的赋值创建了一个局部变量。它只能在 __init__函数中使用,因为它没有保存在实例、类或全局作用域中。

我们可以把这个范围用作: 个案1: 在班上 < br >

class test:
def __init__(self, a):
self.__elements = a
def change_a(self): self.__elements = 5

个案2: Outside class

t = test(5)

这将通过 object._ classname _ _ Privatevaribalename 访问

print(t._test__elements)

这将打印

虽然我已经回答了你的问题,但我还是要对你的问题补充一些意见:

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

这就像一个静态变量,可以使用类名调用它。这些变量对所有函数都可用,任何函数都可以修改和打印它。

在类中的函数中声明一个变量: 只有那个函数可以访问它(它在那个函数的作用域中) :

如果变量声明没有 self,那么它只能在该函数中访问,就像局部变量一样。但是,如果它是像 self.var= 'somevalue'一样使用 self声明的,那么它可以通过任何对象访问,但不能通过类名访问。

在类中的一个函数中声明一个包含 self.(variable name)的变量: 所有的类函数都可以访问它(这与 global (variable name)有什么不同?)

请参阅上面部分的答案。

And since there is no private / protected, everything is public, so everything accessible from inside a class is accessible from outside the class

Yes, but we can use single underscore to tell the world this variable is private, but technically that actually doesn't make it private.