3

私はPythonを初めて使用するので、この質問には簡単に答えられるはずです。

単純化された私の問題はこれです...

ファイルクラスAとクラスBに2つのクラスがあります。クラスAはファイルで最初に定義され、クラスBは2番目に定義されます。

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にはSecondのForeignKeyがあり、SecondにはFirstの2つの外部キーがあります。

BもAを必要とするため、AをBの下に移動しても問題は解決しません。単に修正しようとしているコードを記述していません。リソースに対して「get」を実行するときに「2番目の」外部キーを戻す必要があります。両方のクラスで。

4

5 に答える 5

5

にアクセスするBには、まず を定義しておく必要がありますB

を定義Bしたときにアクセスしたい場合は、ファイル内で上に移動する必要があります。 AA

でメソッドを呼び出すBときにアクセスしたい場合は、何もする必要はありません。 のメソッドを呼び出すまでに、インタープリターはすべての定義を実行しています。 AA

于 2012-12-06T15:32:22.513 に答える
5

したがって、答えは qoutes を使用することでした

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

Python がクラス宣言を見つけると、新しいスコープが作成され、このコード ブロック内のクラス内のコードが実行されます。これは、クラス宣言が実行されると、すべてのクラス変数がインスタンス化されることを意味します。

さて、次のような 2 つのクラスがあるとします。

class A:
    something = B

class B:
   pass

Python はクラスを作成するsomething = B に実行されるため、 .BNameError

これは非常に簡単な方法で回避できます。

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 に答える