实例化后的python范围

时间:2012-12-03 19:44:06

标签: python python-2.7

我正在尝试学习OO Python,并且在对象属性实例化之后我对它的范围有疑问。所以,我决定写一个非常简单的程序:

class Struct:
    def __init__(self):
        self.resadd=[]
        self.ressub=[]
        self.resmul=[]

class MathStruct:
    def mathss(self,x,y):
        add=x+y
        sub=x-y
        mul=x*y
        resstruct.resadd.append(add)
        resstruct.ressub.append(sub)
        resstruct.resmul.append(mul)

if __name__=='__main__':
    resstruct=Struct()
    for i in range(10,20):
        mathsstuff=MathStruct()
        mathsstuff.mathss(i,5)
    print len(resstruct.resadd),resstruct.resadd
    print len(resstruct.ressub),resstruct.ressub
    print len(resstruct.resmul),resstruct.resmul

正如您所看到的,该程序非常简单 - 但是,这是我的问题 - 我使用以下方法实例化“result”对象:     resstruct = STRUCT() 然后在“mathss”函数中使用resstruct.resadd,resstruct.ressub和resstruct.resmul属性。这是合法的(我得到正确的答案!)?这是否意味着即使在其他函数中对象属性也可用?

通常情况下,我会从函数中返回值,然后将其附加到object属性,但我很高兴地看到我可以直接修改另一个函数中的object属性。

..简而言之,我的问题是对象属性实例化后的范围是什么?很抱歉,这是一个101问题。

1 个答案:

答案 0 :(得分:3)

restruct = Struct()出现在模块顶层,在任何函数或类之外,因此它在模块全局命名空间中创建一个对象。正如术语所暗示的,该命名空间对于模块是全局的,并且可以从所有函数访问。如果你在一个函数内部完成了restruct = Struct(),它就不会是全局的,并且在函数完成时会消失。

换句话说,如果您在函数范围内创建了它,则对象的生命周期将限制在该范围内。但是你在全球范围内创造了它,所以它永远存在。 (对象的属性没有自己的范围;它们位于该对象自己的实例命名空间内,只能通过该对象访问。只要您可以访问{obj.attr,就可以访问obj 1}}。)

(注意,从函数内部向全局变量分配需要global语句。您可以访问restruct,因为您只读取了restruct的值变量并用方法改变该对象。如果你试图在函数中分配{{1}},你将创建一个新的局部变量,遮蔽全局变量。)