我是Python的新手,我觉得这个问题应该很容易回答。
我的问题简化了......
我在文件类A和类B中有2个类。文件中首先定义了类A,第二个定义了类B.
class A
...
class B
...
如何使用A类访问B类?
class A
something = B
class B
somethingElse = A
以下是我正在尝试解决的实际代码
class FirstResource(_ModelResource):
class Meta(_Meta):
queryset = First.objects.all()
resource_name = 'first'
allowed_methods = ['get','put']
filtering = {
'a': ALL_WITH_RELATIONS,
'b': ALL_WITH_RELATIONS,
'c': ALL_WITH_RELATIONS,
}
ordering = ['apt']
# this is the line that would fix everything
second = fields.ForeignKey(SecondResource, 'second', null=True, blank=True, default=None, full=True)
...
class SecondResource(_ModelResource):
class Meta(_Meta):
queryset = Second.objects.all()
resource_name = 'second'
execute_methods = ['get', 'post']
filtering = {
'name': ['exact'],
'leader': ['exact'],
}
super = fields.ForeignKey(FirstResource, 'super', null=True, blank=True, default=None, full=True)
leader = fields.ForeignKey(FirstResource, 'leader', null=True, blank=True, default=None, full=True)
...
在Python中没有预先声明我真的不确定如何解决这个问题。 models.py中的First具有SecondK的ForeignKey,Second具有First的2个外键。
移动A低于B并不能解决问题,因为B也需要A.我没有写代码我只是想修复它 - 当我做'得到'时我需要'第二'外键回来对于这两个类中的资源。
答案 0 :(得分:4)
要访问B
,您必须先定义B
。
如果您想在定义 B
时访问A
,则需要将其移至文件中的A
上方。
如果您想在 B
中调用方法时访问A
,则无需执行任何操作:当您调用{{{ 1}},解释器执行了所有定义。
答案 1 :(得分:3)
所以答案是使用qoutes
B = fields.ForeignKey('api.resources.B', 'B')
答案 2 :(得分:2)
当python找到一个类声明时,它会创建一个新的作用域,执行此代码块中类的代码。这意味着在执行类声明时会实例化所有类变量。
现在,如果您有两个类,如:
class A:
something = B
class B:
pass
Python会在创建something = B
类之前执行B
,因此会产生NameError
。
您可以通过非常简单的方式避免这种情况:
class A:
something = None
class B:
pass
A.something = B
答案 3 :(得分:0)
class A:
def __init__(self):
print "In A"
class B:
def __init__(self):
a = A()
print "In B"
b = B()
我想你想要那样的东西。
答案 4 :(得分:0)
我想到的一种解决方法是将类分成多个文件,因此您可以拥有一个python包“ models”,其中将包含A.py和B.py。这样就可以避免订购问题