3

我对 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 有一个 ForeignKey 为 Second,Second 有 2 个外键为 First。

将 A 移到 B 下面并不能解决问题,因为 B 也需要 A。我没有编写代码,我只是想修复它 - 当我对资源执行“获取”时,我需要返回“第二个”外键在两个班级。

4

5 回答 5

5

要访问B,您必须首先定义B

如果要在定义B时访问,则需要将其移到文件上方。 AA

如果你想在调用 中的方法时访问B A不需要做任何事情:当你调用 的方法时A,解释器已经执行了所有的定义。

于 2012-12-06T15:32:22.513 回答
5

所以答案是使用 qoutes

B = fields.ForeignKey('api.resources.B', 'B')
于 2012-12-08T17:17:12.510 回答
2

当 python 找到一个类声明时,它会创建一个新作用域并执行此代码块中类内的代码。这意味着在执行类声明时会实例化所有类变量。

现在,如果您有两个类,例如:

class A:
    something = B

class B:
   pass

Python 将在创建类something = B 之前B执行,因此它会生成一个NameError.

您可以通过非常简单的方式避免这种情况:

class A:
    something = None

class B:
    pass

A.something = B
于 2012-12-06T15:51:36.697 回答
0
class A:
    def __init__(self):
        print "In A"

class B:
    def __init__(self):
        a = A()
        print "In B"
b = B()

我想你想要这样的东西。

于 2012-12-06T15:29:09.220 回答
0

我想到的一种解决方法是将类分成多个文件,这样您就可以拥有一个 python 包“模型”,其中包含 A.py 和 B.py。然后你避免了订购问题

于 2020-08-09T10:47:54.943 回答