实例化后对象的python范围

2024-06-24 13:04:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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”对象: restruct=结构() 然后使用重新添加, resstruct.Resub公司以及resstruct.resmul公司“mathss”函数中的属性。这合法吗(我得到了正确的答案!)?这是否意味着对象属性即使在其他函数中也可用?在

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

……简而言之,我的问题是,一旦对象属性被实例化,它的作用域是什么?抱歉,如果这是一个101问题。在


Tags: 对象实例函数self程序len属性class
1条回答
网友
1楼 · 发布于 2024-06-24 13:04:04

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

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

(注意,从函数内部给全局变量赋值需要一个global语句。您能够访问restruct,因为您只读取变量的值并用方法对该对象进行变异。如果试图在函数中赋值给restruct,则会创建一个隐藏全局变量的新局部变量。)

相关问题 更多 >