Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在声明类之前引用python中的类_Python_Django_Forward Declaration - Fatal编程技术网

在声明类之前引用python中的类

在声明类之前引用python中的类,python,django,forward-declaration,Python,Django,Forward Declaration,好的,使用Django REST框架教程中的直接示例,我有两个类:UserSerializer和SnippetSerializer。我希望能够在SnippetSerializer类声明中使用“UserSerializer”作为序列化程序,但出于某些原因,需要首先声明SnippetSerializer。代码示例: class SnippetSerializer(serializers.HyperlinkedModelSerializer): owner = UserSerializer()

好的,使用Django REST框架教程中的直接示例,我有两个类:UserSerializer和SnippetSerializer。我希望能够在SnippetSerializer类声明中使用“UserSerializer”作为序列化程序,但出于某些原因,需要首先声明SnippetSerializer。代码示例:

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    owner = UserSerializer()
    #unimportant stuff

class UserSerializer(serializers.HyperlinkedModelSerializer):
    #unimportant stuff - lets say we reference SnippetSerializer here
我想到的显而易见的答案是向前声明,但从我所有的研究来看,我在Python中找不到这个

另一个我认为可能有效的解决方案(也许我做错了?)是尝试在init方法中声明这种关系

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    def __init__(self, *args, **kwargs):
        self.owner = UserSerializer()
        super(SnippetSerializer, self).__init__(*args, **kwargs)
但该框架似乎完全忽视了这一点

我也尝试过使用@addto,但它似乎只适用于函数,而不适用于属性


有办法解决这个问题吗?这个先鸡后蛋的类问题在Python中已经折磨了我一段时间,但我终于遇到了一个实例,它实际上阻止了我完成工作。

这个问题听起来与StackOverflow上发布的其他Django forward声明问题非常相似。您是否可以使用类似于需要在Django函数调用中包装
owner
成员的东西,我不知道在这种情况下是否有合适的调用。此解决方案也是Django特有的,而不是Python的本机功能。

您可以提供一个包含类的(点表示法)路径的字符串

使用DRF,您可能有如下文件夹结构:

├── appname
│   ├── ...
│   └── serializers.py
├── ...
SnippetSerializer
UserSerializer
在上述
serializers.py
文件中声明


然后使用字符串引用
UserSerializer
:appname.serializers.UserSerializer通常在哪里编写
UserSerializer

程序启动后是否声明类?通常,您会在运行程序之前声明类/函数。我对Django非常了解,但经典的方法是在SnippetSerializer之前声明UserSerializerBase,然后从中继承UserSerializer。这就是Python,您当然可以在事实发生后更改实际的类定义,从而在SnippetSerializer之前声明UserSerializer,然后在以后修改它。@user-是的,但由于django是一种没有头的解释语言,它不做像javascript这样的语言所做的前向读取工作,在代码到达其声明之前,您不能引用另一个类。@deets-我明白您的意思,该方法可以工作,但不能完全工作,因为Djangos嵌套类的内容没有相互继承。这是个好主意,不过我以后会记住的。另外,出于好奇,我最近才开始在这个网站上进行互动。为什么人们经常发表评论,而不是给出一个可以被正确投票/接受的答案?通常评论是为了人们猜测工作或者“你试过了吗?”。答案是100%肯定这会起作用。