英文:
How to access a class variable in a method in python
问题
标题已经说了一切。我想要使用一个类变量,但我一直收到一个名称错误。我该怎么解决这个问题?
这是我的代码:
class a:
var = 0
def foo():
print(a.var)
foo()
b = a()
这是错误代码:
NameError: name 'a' is not defined
英文:
Title says it all. I want to use a class variable but I keep getting a name error. What can I do to solve this?
Here's my code:
class a:
var = 0
def foo():
print(a.var)
foo()
b = a()
Here's the error code:
NameError: name 'a' is not defined
答案1
得分: 1
这是您想要实现的吗?
class a:
var = 0
def foo(self):
print(self.var)
b = a()
b.foo() # "print(b.var)" also works
上面的代码产生了以下结果:
0
英文:
Is this what you want to achieve?
class a:
var = 0
def foo(self):
print(self.var)
b = a()
b.foo() # "print(b.var)" also works
Above code gives the following result:
0
答案2
得分: 0
在foo
函数内,打印语句应通过调用self.var
来访问变量var
,而不是a.var
。此外,方法foo
应该具有默认参数self
,如下所示:
def foo(self):
...
英文:
Inside the foo
function, the print statement should access the variable var
by calling self.var
, and not a.var
. Also, the method foo
should have a default parameter of self
, like so:
def foo(self):
...
答案3
得分: 0
Python 对于类变量的处理方式有点棘手,我认为。
以这段代码为例:
class a:
var = 0
def foo(self):
self.my_name = [k for k,v in globals().items() if v is self][0]
print(f'----------{self.my_name}.var address:', id(a.var))
print(f'self.var in {self.my_name} instance:', id(self.var))
def change(self):
print(f'changing self.var value to 1 in {self.my_name} instance')
self.var = 1
b = a()
c = a()
b.foo()
c.foo()
c.change()
b.foo()
c.foo()
输出结果如下:
----------b.var address: 140434476089552
self.var in b instance: 140434476089552
----------c.var address: 140434476089552
self.var in c instance: 140434476089552
changing self.var value to 1 in c instance
----------b.var address: 140434476089552
self.var in b instance: 140434476089552
----------c.var address: 140434476089552
self.var in c instance: 140434476089584
您可以看到,在c
上的某些写操作(self.var = 1
)创建了一个新的变量(实例变量)供c
使用。这是您需要注意的问题,否则您将不会使用类变量,而只会使用不相关的实例变量。
相反,您应该始终使用 a.var
。这也是为什么访问类变量的方法不应该有 self
作为参数,以避免混淆的原因。
英文:
Python acts in a bit of a tricky way with class variables imo.
Taking this snippet of code as example :
class a:
var = 0
def foo(self):
self.my_name = [k for k,v in globals().items() if v is self][0]
print(f'----------{self.my_name}.var adress:', id(a.var))
print(f'self.var in {self.my_name} instance:', id(self.var))
def change(self):
print(f'changing self.var value to 1 in {self.my_name} instance')
self.var = 1
b = a()
c = a()
b.foo()
c.foo()
c.change()
b.foo()
c.foo()
which outputs
----------b.var adress: 140434476089552
self.var in b instance: 140434476089552
----------c.var adress: 140434476089552
self.var in c instance: 140434476089552
changing self.var value to 1 in c instance
----------b.var adress: 140434476089552
self.var in b instance: 140434476089552
----------c.var adress: 140434476089552
self.var in c instance: 140434476089584
You can see that some write operation (self.var
= 1) in the c
context did create a new variable (an instance variable) for c. This is something you really have to be aware of, otherwise you won't work with class variables but only uncorrelated instance variables.
Instead, you should always use a.var
. This is also why method accessing class variables only should not have self
as a parameter, to avoid this confusion.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论