Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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 将带有_插槽的子类转换为json_Python_Json_Python 3.x_Inheritance_Flask - Fatal编程技术网

Python 将带有_插槽的子类转换为json

Python 将带有_插槽的子类转换为json,python,json,python-3.x,inheritance,flask,Python,Json,Python 3.x,Inheritance,Flask,我在Python方面是个十足的傻瓜,我忍不住又做了一次,梦想着一些我无法实现的事情 我想有一个类,可以这样实例化: my_class = MyClass(**params) 并在烧瓶中如此消耗: jsonify(my_class) 预期结果将是JSON: { "key" : "value", ... } 现在,MyClass的实现是 class MyClas(NamedMutableSequence, Document): __slots__ = ( 'key_1'

我在Python方面是个十足的傻瓜,我忍不住又做了一次,梦想着一些我无法实现的事情

我想有一个类,可以这样实例化:

my_class = MyClass(**params)
并在烧瓶中如此消耗:

jsonify(my_class)
预期结果将是JSON:

{ "key" : "value", ... }
现在,MyClass的实现是

class MyClas(NamedMutableSequence, Document):
    __slots__ = (
        'key_1',
        'key_2',
        'key_3'
    )

def __init__(self, **params):
    NamedMutableSequence.__init__(self, **params)
    Document.__init__(self, 'myclass')

def save(self):
    self._db_col.update({'key_1': self.key_1}, {'key_2': self.key_2, 'key_3': self.key_3})
现在,您想知道什么是
NamedMutableSequence
Document

    class NamedMutableSequence(Sequence):
        ___slots__ = ()

        def __init__(self, *positional_values, **keyword_values):
            subclass_propeties = self.__slots__
            for key in subclass_propeties:
                setattr(self, key, keyword_values.get(key))

            if positional_values:
                for key, value in zip(subclass_propeties, positional_values):
                    setattr(self, key, value)

        def __str__(self):
            values = ', '.join('%s=%r' % (key, getattr(self, key)) for key in self.__slots__)
            return '%s(%s)' % (clsname, values)

        __repr__ = __str__

        def __getitem__(self, item):
            return getattr(self, item)

        def __setitem__(self, item, value):
            return setattr(self, item, value)

        def __len__(self):
            return len(self.__slots__)
诚然,我只是将某人的解决方案复制到这个基类的一个可变名称的元组中,并修复了
\uuu getitem\uuuu
&
\uuu setitem\uuuu
以允许
我的class.key\u1='some value'

class Document():
    __slots__ = ('_db_col')

    def __init__(self, collection):
        self._db_col = mongo_db[collection]
这正是我在尝试一个基类时所说的,我将在整个db连接模型类中使用这个基类

在我看来,这就是问题的开始,我对自己太过分了,把事情搞得一团糟。因为无论我尝试什么,我都无法停止提出
TypeError:{string value of my_class}不是JSON可序列化的

更糟糕的是,当我尝试
dict(my_class)
时,我得到了一个闪亮的
属性必须是字符串
错误,该错误在
getattr()上引发

我仍然希望保留基类,并且仍然需要使其可JSON序列化


我怎样才能拯救自己?

我终于找到了答案,解决方案是从另一个stackoverflow帖子()中找到的

我所做的只是在
NamedMutableSequence
上添加了另一个方法:

def json(self):
    return {key : getattr(self, key, None) for key in self.__slots__}
当我需要JSON可解析字典时,只需调用它,例如:

my_class = MyClass(**params)
jsonify(my_class.json())

你为什么要在这里使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
?这是一种优化,应该很少使用。@DanielRoseman好吧,既然你提到了,这可能是一种试图过度优化的反模式。但这已经发生了,我认为仍然值得寻求解决办法,即使只是为了教育目的。