将类实例化为类属性

时间:2015-05-04 21:07:42

标签: python python-2.7

我试图理解为什么我不能将已定义的类实例化为另一个类的属性。究竟发生了什么,它背后的Python逻辑是什么?是否有任何解决方法可以让我将类的实例用作类属性(静态属性)?

class FirstClass():
    class_var = SecondClass()
    def __init__(self):
        self.instance_var = "Instance VAR"


class SecondClass():
    def print_msg(self):
        print "SecondClassMessage"


first_class = FirstClass()
print first_class.class_var

它给了我这个:NameError: name 'SecondClass' is not defined

4 个答案:

答案 0 :(得分:2)

正确的解决方法是重新排列类,以便在您尝试使用它们时它们存在。

如果出于某些原因这是不可能的,那么您可以在之后将该属性添加到该类中,前提是在创建类时不需要其他用途......如果它

答案 1 :(得分:2)

声明

class_var = SecondClass()

包含在FirstClass的正文中,因此在创建时直接执行。目前还没有引入名称SecondClass,这就是口译员抱怨的原因。

这与类的__init__方法中包含的语句形成对比,在创建实例之前不会执行它们。

因此,正如其他人已经说过的那样,您必须在SecondClass之前定义FirstClass

答案 2 :(得分:1)

class SecondClass():
    def print_msg(self):
        print "SecondClassMessage"

class FirstClass():
    class_var = SecondClass()
    def __init__(self):
        self.instance_var = "Instance VAR"

first_class = FirstClass()
print first_class.class_var

编辑: 您必须更改顺序,以便Python知道SecondClass是什么。否则,当所有类都加载到内存中时,您必须稍后将SecondClass分配给FirstClass。

如果你解释为什么需要这个,我们可能会给你一个更好的方法。

答案 3 :(得分:1)

虽然其他人是正确的,重新安排您定义类的顺序将允许它工作,我更喜欢初始化为None然后在__init__实例化:

class FirstClass():
    class_var = None
    def __init__(self):
        self.instance_var = "Instance VAR"
        if FirstClass.class_var is None:
            FirstClass.class_var = SecondClass()

class SecondClass():
    def print_msg(self):
        print "SecondClassMessage"

first_class = FirstClass()
print first_class.class_var

它确实在代码中添加了一个if块。但是,重新安排事情不会破坏任何事情。我也认为它使意图更清晰。