标题说的差不多,但是我将提供一些示例代码来阐明。 我想知道为什么我可以将对类的引用“修复”分配给实例变量而不是类变量
class NotWorkingDefinitions:
# This will give unresolved reference
a = Repair
class WorkingDefitinions:
def __init__(self):
# This is fine
self.a = Repair
class Repair():
def __init__(self):
whatever = 10
def dosmt(self):
print("staring at a wall")
编辑:完整的答案给出了不同的评论。这不是关于不能分配给一个类变量。只是类变量可以立即解析,而实例变量不能立即解析。后者使得在WorkingDefinitions之后定义Repair()类不是问题。
答案 0 :(得分:1)
如果将Repair
移到顶部,则上面的代码将起作用。类的内容是从上到下进行评估的,因此在实际引用它们之前,必须先定义所有引用的类。
在运行时和加载时间方面对此进行更多探讨的示例可能是:
# this will not work because the B class is referenced before definition
class A(object):
b_class = B
class B(object):
pass
或者,
# this will work because B is defined first and used later
class B(object):
pass
class A(object):
b_class = B
但是,以上两个示例都没有特定于运行时的行为。相反,如果您想让A
使用B
,并且有充分的理由首先定义A
,那么您就可以摆脱
class A(object):
def __init__(self):
# bind the B class to each instance of A
self.b_class = B
class B(object):
pass
a = A()
a.b_class
> __main__.B
但是简单的答案是必须在使用变量之前先定义变量,并且在将变量直接绑定到类时(在类定义中,而不是方法中),必须对其进行定义。
>答案 1 :(得分:0)
完整的答案给出了不同的评论。这与无法分配给类变量无关。它是立即评估类变量,而不评估实例变量。实例变量将在启动期间进行评估。后者使得在WorkingDefinitions之后定义Repair()类不再是问题。