我正在尝试学习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问题。
答案 0 :(得分:3)
行restruct = Struct()
出现在模块顶层,在任何函数或类之外,因此它在模块全局命名空间中创建一个对象。正如术语所暗示的,该命名空间对于模块是全局的,并且可以从所有函数访问。如果你在一个函数内部完成了restruct = Struct()
,它就不会是全局的,并且在函数完成时会消失。
换句话说,如果您在函数范围内创建了它,则对象的生命周期将限制在该范围内。但是你在全球范围内创造了它,所以它永远存在。 (对象的属性没有自己的范围;它们位于该对象自己的实例命名空间内,只能通过该对象访问。只要您可以访问{obj.attr
,就可以访问obj
1}}。)
(注意,从函数内部向全局变量分配需要global
语句。您可以访问restruct
,因为您只读取了restruct
的值变量并用方法改变该对象。如果你试图在函数中分配{{1}},你将创建一个新的局部变量,遮蔽全局变量。)