【问题标题】:Referencing a class in python before it is declared在声明之前在python中引用一个类
【发布时间】:2016-05-25 06:45:32
【问题描述】:

我正在使用 Django REST 框架教程中的直接示例,我有 2 个类:UserSerializerSnippetSerializer。我希望能够在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 中已经让我死了一段时间,但我终于遇到了一个实例,它实际上阻止了我完成工作。

【问题讨论】:

  • 你是在程序启动后声明类吗?通常你会在运行程序之前声明类/函数。
  • 我对 Django 有一定的了解,但经典的方法是在 SnippetSerializer 之前声明 UserSerializerBase,然后从中继承 UserSerializer。而这是 Python,当然可以在事后更改实际的类定义,从而在 SnippetSerializer 之前声明 UserSerializer,然后再进行修改。
  • @user - 是的,但是由于 django 是一种没有标题的解释性语言,并且它不会像 javascript 这样的语言那样做前向阅读,所以在代码到达之前你不能引用另一个类它的声明。
  • @deets - 我明白你在说什么,并且该方法有点工作,但不完全,因为 Django 嵌套类的东西没有相互继承。这是个好主意,但我以后会记住的。另外,好奇,我最近才真正在这个网站上进行互动。为什么人们如此频繁地发表评论,而不是给出一个可以适当赞成/接受的答案?
  • 通常 cmets 用于人们的猜测工作或类似“你试过这个吗?”。答案是 100% 确定这会奏效。

标签: python django forward-declaration


【解决方案1】:

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

使用 DRF,您可能会有这样的文件夹结构:

├── appname
│   ├── ...
│   └── serializers.py
├── ...

SnippetSerializerUserSerializer 在上述 serializers.py 文件中声明。

然后,您将使用以下字符串引用 UserSerializer"appname.serializers.UserSerializer",您通常会在其中编写 UserSerializer

【讨论】:

    【解决方案2】:

    这个问题听起来与 StackOverflow 上发布的其他 Django 前向声明问题非常相似。你能用this style of forward declaration?之类的东西吗?你需要将owner成员包装在Django函数调用中,我不知道在这种情况下是否有合适的调用。这个解决方案也是 Django 特有的,而不是 Python 的原生特性。

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多