Python类在与另一个类相同的文件中定义 - 如何访问文件中稍后定义的类?

时间:2012-12-06 15:16:16

标签: python django django-models

我是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.我没有写代码我只是想修复它 - 当我做'得到'时我需要'第二'外键回来对于这两个类中的资源。

5 个答案:

答案 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。这样就可以避免订购问题