具有可变属性名称的Python类工厂

时间:2017-10-20 18:02:42

标签: python metaprogramming

我正在创建一个Django应用程序,在开发过程中,我创建了许多具有非常相似结构的类,例如:

class OneAPIListView(generics.ListAPIView):
    queryset = models.One.objects.all()
    serializer_class = serializers.OneSerializer
    filter_class = OneFilterSet

class TwoAPIListView(generics.ListAPIView):
    queryset = models.Two.objects.all()
    serializer_class = serializers.TwoSerializer
    filter_class = TwoFilterSet

...
class <Name>APIListView(generics.ListAPIView):
    queryset = models.<Name>.objects.all()
    serializer_class = serializers.<Name>Serializer
    filter_class = <Name>FilterSet

我想知道是否有办法从字符串["One", "Two", ..., <Name>]列表中自动生成这些类。我看到其他SO问题like this中有元类,例如我可以做类似

的事情
<Name> = type(<Name> + "APIListView", (generics.ListAPIView,), {'queryset' : ???})

但我不知道在我的情况下放入???的内容,因为变量是对象名称的一部分。

1 个答案:

答案 0 :(得分:1)

只需输入{'queryset': getattr(models, name).objects.all()}等等。 getattr很重要,知道你是否会做任何类型的元编程。偶尔也setattr,但不常见,特别是如果您只是使用type(...)构建类。