为什么无法将对类的引用分配给类变量?

时间:2018-11-29 11:14:26

标签: python class

标题说的差不多,但是我将提供一些示例代码来阐明。 我想知道为什么我可以将对类的引用“修复”分配给实例变量而不是类变量

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()类不是问题。

2 个答案:

答案 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()类不再是问题。