为什么我不能在 class 中初始化变量后立即使用它?
Why can't I use a variable immediately after it is initialised in a class?
为什么我不能在 class 中初始化变量后立即使用它?
1. class A:
2. var1 = <call_to_a_function_outside_class_A>
3. Var2 = <something_to_with_var1>
....
我明白了
NameError: name 'var1' is not defined (at line number 3)
我错过了什么?
显然你有这样的东西:(一个 lambda/function 里面有 var1
)
class A:
var1 = 10
var2 = lambda: print(var1)
A.var2() # NameError: name 'var1' is not defined
原因在于 Python 的范围规则。 class 中的方法不是 嵌套 在 class 中,这意味着如果 Python 在方法中找不到变量,它不会检查 class 的命名空间以找到它。
相反 它将查看模块的名称空间(globals()
字典)以查看是否有 var1
:
class A:
var1 = 10
var2 = lambda: print(var1)
var1 = "something"
A.var2() # "something"
如果您需要在方法中访问 class 变量,您可以 hard-code class 的名称 (print(A.var1)
) 或使用 __class__
:(我会在这里使用def
关键字和常规方法,也从实例调用方法)
class A:
var1 = 10
def my_method(self):
print(self.__class__.var1)
print(A.var1)
var1 = "something"
obj = A()
obj.my_method()
输出:
10
10
为什么我不能在 class 中初始化变量后立即使用它?
1. class A:
2. var1 = <call_to_a_function_outside_class_A>
3. Var2 = <something_to_with_var1>
....
我明白了
NameError: name 'var1' is not defined (at line number 3)
我错过了什么?
显然你有这样的东西:(一个 lambda/function 里面有 var1
)
class A:
var1 = 10
var2 = lambda: print(var1)
A.var2() # NameError: name 'var1' is not defined
原因在于 Python 的范围规则。 class 中的方法不是 嵌套 在 class 中,这意味着如果 Python 在方法中找不到变量,它不会检查 class 的命名空间以找到它。
相反 它将查看模块的名称空间(globals()
字典)以查看是否有 var1
:
class A:
var1 = 10
var2 = lambda: print(var1)
var1 = "something"
A.var2() # "something"
如果您需要在方法中访问 class 变量,您可以 hard-code class 的名称 (print(A.var1)
) 或使用 __class__
:(我会在这里使用def
关键字和常规方法,也从实例调用方法)
class A:
var1 = 10
def my_method(self):
print(self.__class__.var1)
print(A.var1)
var1 = "something"
obj = A()
obj.my_method()
输出:
10
10