我正在尝试学习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问题。在
行
restruct = Struct()
出现在模块顶层,在任何函数或类之外,因此它在模块全局命名空间中创建一个对象。顾名思义,这个名称空间对模块是全局的,可以从所有函数访问。如果在一个函数中完成restruct = Struct()
,那么它就不是全局的,并且在函数完成时会消失。在换句话说,如果您是在函数作用域中创建的,则对象的生存期将限制在该范围内。但你在全球范围内创造了它,所以它永远存在。(一个对象的属性本身没有作用域;它们位于对象自己的实例名称空间内,只能通过对象访问。只要可以访问
obj.attr
,就可以访问obj.attr
。)(注意,从函数内部给全局变量赋值需要一个
global
语句。您能够访问restruct
,因为您只读取变量的值并用方法对该对象进行变异。如果试图在函数中赋值给restruct
,则会创建一个隐藏全局变量的新局部变量。)相关问题 更多 >
编程相关推荐