实例化后对象的python范围

实例化后对象的python范围,python,python-2.7,Python,Python 2.7,我正在尝试学习面向对象的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

我正在尝试学习面向对象的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.resub和resstruct.resmul属性。这合法吗(我得到了正确的答案!)?这是否意味着对象属性即使在其他函数中也可用

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


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

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

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


(但请注意,从函数内部指定全局变量需要一个
global
语句。您可以访问
restruct
,因为您只读取变量的值并使用方法对该对象进行变异。如果您试图在函数内指定
restruct
,您将创建一个新的局部变量。)变量隐藏在全局名称空间中。)

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

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


(但请注意,从函数内部指定全局变量需要一个
global
语句。您可以访问
restruct
,因为您只读取变量的值并使用方法对该对象进行变异。如果您试图在函数内指定
restruct
,您将创建一个新的局部变量。)可变阴影(全局阴影)

同样值得注意的是,这是一个非常糟糕的设计,会再次困扰你。这样做不是一个好主意。@Lattyware:你能解释一下为什么这是一个非常糟糕的设计吗?@JohnJ问题是,你很少真正想要某样东西,即使你想要,你以后也会发现你想要生产另一种东西用于其他地方。全局的行为可以用良好的数据传递来代替,这将使您的类更易于移动和重用。@BrenBarn:非常感谢您的回答。因此,我所做的并不是什么有趣的事情——基本上,如果一个对象在全局范围内声明,它的(及其属性是)到处都有-这是底线吗?同样值得注意的是,这是一个非常糟糕的设计,会再次困扰你。这样做不是一个好主意。@Lattyware:你能解释一下为什么这是一个非常糟糕的设计吗?@JohnJ问题是,你很少真正想要某样东西,即使你想要,你以后也会发现你想要生成另一个供其他地方使用。全局对象的行为可以用良好的数据传递来代替,并将使您的类更易于移动和重用。@BrenBarn:非常感谢您的回答。因此,我所做的并不是什么有趣的事情——基本上,如果在全局范围内声明对象,则其(及其属性)是随处可见-这是底线吗?您的问题有点混乱-可以访问对象的任何对象都可以访问属性。这里的问题是对象的范围。您的问题有点混乱-可以访问对象的任何对象都可以访问属性。对象的范围是他所关心的问题重新。