如何在另一个函数内部的函数内设置类变量?
var.py
class A:
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
def seta(self):
def afunction():
self.a = 4
afunction()
def geta(self):
return self.a
run.py
cA = A()
print cA.a
cA.seta()
print cA.a
print cA.geta()
python run.py
1
1
1
为什么a不等于4?我怎样才能使它等于4?
由于
抱歉,我原来的代码叫做 - 忘了。
编辑:
谢谢大家 - 对不起,我刚才看到了。我不小心被我的一个名字所取代....所以我的范围实际上都没问题。
答案 0 :(得分:11)
问题是有多个self
个变量。传递给内部函数的参数会覆盖外部函数的范围。
您可以通过从内部函数中删除self
参数并确保以某种方式调用该函数来克服此问题。
class A:
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
def seta(self):
def afunction(): # no self here
self.a = 4
afunction() # have to call the function
def geta(self):
return self.a
答案 1 :(得分:2)
正如其他人所提到的,afunction
从未被调用过。你可以这样做:
class A:
def __init__(self):
self.a = 1
def seta(self):
def afunction(self):
self.a = 4
afunction(self)
def geta(self):
return self.a
a = A()
print a.a
a.seta()
print a.a
我们实际调用afunction
并明确传递self
,但这是设置属性a
的一种相当愚蠢的方式 - 特别是当我们可以明确地执行它而不需要对于getter或setter:a.a = 4
或者你可以return
这个功能:
def seta(self):
def afunction(): #Don't need to pass `self`. It gets picked up from the closure
self.a = 4
return afunction
然后在代码中:
a = A()
a.seta()() #the first call returns the `afunction`, the second actually calls it.
答案 2 :(得分:1)
在seta
内,您可以定义一个函数
def afunction(self):
self.a = 4
... 将self.a
设置为4,如果它被调用的话。但它并没有在任何地方调用,所以a
没有改变。
答案 3 :(得分:-1)
正如其他几位人士所说,你需要在某些时候实际调用函数。评论不会让我输入这个可理解的,所以这里是一个答案:
def seta(self):
def functiona(self): #defined
self.a = 4
functiona() #called
答案 4 :(得分:-1)
你怎么能把它等同于4:
class A:
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
def seta(self):
##def afunction(self): (remove this)
self.a = 4
def geta(self):
return self.a
棘手的部分:为什么不等于4 ...
目前a只通过“功能”设置为4。由于函数永远不会被调用,所以它永远不会执行.. seta有“函数”嵌套在里面但没有调用...类似于类中的成员变量。