【问题标题】:Why can't I use a variable immediately after it is initialised in a class? [closed]为什么不能在类中初始化变量后立即使用它? [关闭]
【发布时间】:2022-12-21 22:40:06
【问题描述】:

为什么不能在类中初始化变量后立即使用它?

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)

我错过了什么?

【问题讨论】:

  • 你能展示你正在使用的实际代码吗?
  • @Axe319 我希望,我可以。但是,这有点机密。我真的很抱歉。我希望你明白。代码类似于伪代码。
  • @Rabindra 你需要有一个minimal reproducible example。您不必拥有确切的代码,只需拥有演示问题的实际代码即可。
  • 你应该总是提供一个。它会帮助人们更容易理解问题,无论是对于试图回答的人还是有相同问题的人。下面的答案是,你的问题是错误的,因为var1不是call_to_a_function_outside_class_A。另外,var2,即something_to_with_var1,将不是造成任何问题除非在非常特殊的情况下,var2 是一个绑定 var1 但错误引用它的闭包。如果它是一个表达式、函数/lambda,带有参数或正确绑定,它就会工作。
  • 所以不,你不能创建任何类或任何类变量。实际上还有更多的情况不会重现该错误。

标签: python python-3.x class


【解决方案1】:

显然你有这样的东西:(里面有 var1 的 lambda/函数)

class A:
    var1 = 10
    var2 = lambda: print(var1)
    
A.var2()  # NameError: name 'var1' is not defined

原因是因为 Python 的作用域规则。类内部的方法不是嵌套在类中,这意味着如果 Python 在方法中找不到变量,它不会检查类的命名空间来找到它。
反而它将在此处查看类的封闭范围,即模块的命名空间(globals() 字典),看看那里是否有 var1

class A:
    var1 = 10
    var2 = lambda: print(var1)

var1 = "something"
A.var2()  # "something"

如果您需要在方法中访问类变量,您可以硬编码类的名称(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

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 2020-09-02
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多