我试图理解为什么我不能将已定义的类实例化为另一个类的属性。究竟发生了什么,它背后的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
答案 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
块。但是,重新安排事情不会破坏任何事情。我也认为它使意图更清晰。