我对Python变量范围和类定义的理解是否正确?

时间:2014-05-05 09:01:31

标签: python class variables

我是Python的新手,目标是2.6版,兼容3.x的前向兼容性。我试图围绕什么访问哪些变量可从哪里访问。 我已经花了很多时间阅读/理解这个主题,最后我想确认我对这个主题的理解的准确性。

这就是我认为我得到的:

您可以将Python脚本的“顶级”视为包含程序中其他所有内容的“根对象”。它就像其他实例化对象,但具有特殊功能:

  • 您可以从任何函数或类访问其成员(变量,函数,类),而无需“自我”

  • 您可以先使用“全局”

  • 从任何类别或功能中重新分配其成员

任何函数/方法,无论嵌套多深,都可以访问在其上方任何位置分配的所有变量。如果变量是一个可变对象,则无论变量是根对象的成员还是更深层嵌套,都可以更改其成员。

如果在函数内使用现有变量名进行赋值,则会创建一个名称相同且范围有限的新局部变量。如果嵌套函数中有多个具有相同名称的局部变量,则访问最近的封闭局部变量。

如果变量是根对象的成员(即存在于脚本的顶层)并且在分配变量名之前使用“global”,则不会创建新的局部变量,因此赋值适用于根对象的成员。在Python 3中,“nonlocal”可以类似地使用,以便将变量赋值应用于赋值变量的最近封闭函数的成员。

因为函数是在执行时创建的,所以用作默认参数赋值的对象将在对函数的重复调用中保持不变。如果对象是可变的,如果函数没有将变量名重新分配给另一个值,则对其成员的更改也将在函数调用期间持续存在。

上面的规则适用于一个类,除了你需要通过“self”从其方法中引用类成员,并通过对类的引用或类的实例化从类外引用。

您可以在方法之外的类中执行语句,例如“根对象”;但是,它们在实例化时执行类定义 not 时立即执行 。然后可以通过引用类本身从类外部访问类成员。就像定义类时一样,它使用自己的对象名称实例化为“类对象”,而不调用构造函数。进一步的实例化是初始实例化(类对象)的浅表副本,无论它存在什么状态,并执行构造函数(如果存在)。当引用类对象而不是实例化时,变量是可访问的,但是除非用@classmethod(允许访问类成员)或@staticmethod(没有)来修饰方法,否则不能调用方法。

在实例化期间仅复制对类成员的引用,因此不在方法内的任何赋值都是在类的所有实例化之间共享的“类变量”。与函数一样,在实例化对象中对相同变量名的赋值将创建一个限制在该对象范围内的新变量,但是对于类的所有实例,包括类对象,都会看到对可变对象成员的更改,因为这些对象中的变量都引用相同的可变对象。为了防止变量在同一个类的实例化之间共享,可以使用“self”在方法中分配它们。

该类存在于它定义的任何范围内(例如,它可以在函数内部,除非函数返回对类的引用,或者将其分配给它有权访问的外部变量,否则将无法访问它)例如,通过全局/非本地,或类变量,或可变对象的成员)。

那么,我是否了解Python范围呢?感谢您的任何见解。

0 个答案:

没有答案