棉花糖:我怎样才能覆盖这个python类的构造函数?

时间:2016-11-11 15:16:00

标签: python serialization override marshmallow

下面是我在基于SQLAlchemy的应用程序中使用的python marshmallow序列化程序。

import simplejson
from marshmallow import Schema
class MySerializer(Schema):
    class Meta:
        json_module = simplejson
        fields = ('field1', 'field2', 'field3')

    field3 = fields.Method('get_field3')

    def get_field3(self, this_obj):
        return "Hello"

以下是我如何调用此序列化程序:

my_argument = 1
items=MySerializer(documents=list_of_my_objects, many=True).data

现在,我想更改序列化程序,使其需要一个额外的参数(我将传入my_argument),如果该参数的值为1,则返回"Goodbye"代替{{ 1}}。我怎么能这样做?

特别是,我不知道如何将参数传递给此marshamallow Schema,以便可以从"Hello"内部获取。我知道我需要覆盖get_field3方法。但我不确定它应该是什么样子。我尝试了以下方法,但它没有工作:

__init__()

这是我得到的堆栈跟踪:

def __init__(self, documents, many, my_arg):
    self.my_arg = my_arg
    super(Schema, self).__init__(documents, many=many)

def get_field3(self, this_obj):
    self.my_arg == 1:
        return "Goodbye"
    else:
        return "Hello" 

1 个答案:

答案 0 :(得分:1)

刚刚从kwargs弹出添加arg以避免任何错误(你可以将任何kwargs传递给方法重新定义):

class MySerializer(Schema):
    # ...
    def __init__(self, *args, **kwargs):
        self.my_arg = kwargs.pop('my_arg') if 'my_arg' in kwargs else None
        super(Schema, self).__init__(*args, **kwargs)

现在你可以传递自定义kwarg(关键字参数,而不是位置)来创建对象:

MySerializer(documents=list_of_my_objects, many=True, my_arg=1)