1

我正在尝试学习 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

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

通常,我会从函数返回值,然后将其附加到对象属性,但我(令人愉快地)惊讶地发现我可以直接在另一个函数中修改对象属性。

..简而言之,我的问题是对象属性在实例化后的范围是什么?对不起,如果这是一个 101 问题。

4

1 回答 1

4

该行restruct = Struct()出现在模块顶层,在任何函数或类之外,因此它在模块全局命名空间中创建一个对象。顾名思义,这个命名空间对模块来说是全局的,并且可以从所有函数中访问。如果您在restruct = Struct()函数内部完成,则它不会是全局的,并且会在函数完成时消失。

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

(但请注意,从函数内部分配给全局变量需要一个global语句。您可以访问restruct,因为您只读取变量的值并使用方法改变该对象。如果您尝试restruct在函数内分配,您将创建一个新的局部变量来覆盖全局变量。)

于 2012-12-03T19:50:46.887 回答