精华内容
下载资源
问答
  • 自定义数据结构

    2020-10-29 13:05:51
    要有对自定义数据结构排序 增删改查的能力

    要有对自定义数据结构排序 增删改查的能力

     

    展开全文
  • 但是Python本身可能需要具有自定义数据结构的json编码

    可能是过度杀戮,但我曾经用过一个Mixin类,如下所示:def _default_json_encoder(obj):

    """ Default encoder, encountered must have to_dict method to be serialized. """

    if hasattr(obj, "to_dict"):

    return obj.to_dict()

    else:

    raise TypeError('Object of type %s with value of %s is not JSON serializable' % (type(obj), repr(obj)))

    class MixinJSONable(object):

    """

    Mixin pattern to add a capability to an object to be jsonable.

    If object have to_dict method it will be used to produce the dict, otherwise

    MixinJSONable.to_dict will be used.

    Only "public" attributes will be dump and instance of self._jsonable tuple.

    Attributes could be ignored by passing ignored_keys parameter to to_json method.

    Thus _ignored_json_keys (class attribute) will be update and spread over all class using this Mixin.

    """

    # _ignored_json_keys = list()

    def to_dict(self):

    """

    to_dict method to dump public attributes.

    """

    self._jsonable = (int, list, str, dict)

    _dict = dict()

    for attr in dir(self):

    value = getattr(self, attr)

    if attr.startswith("_") or attr in getattr(MixinJSONable, "_ignored_json_keys", []):

    continue

    elif isinstance(value, self._jsonable) or value is None or hasattr(value, 'to_dict'):

    # to_dict method is used as serialization method.

    value = value

    else:

    continue

    _dict[attr] = value

    return _dict

    def to_json(self, **kw):

    """

    Dump object as Json.

    Accept the same keys than :func json.dumps:. If ignored_keys (list) is passed,

    the keys will not be dumped in the json (filter over all sons)

    """

    indent = kw.pop("indent", 4) # use indent key if passed otherwise 4.

    _ignored_json_keys = kw.pop("ignored_keys", [])

    if _ignored_json_keys:

    MixinJSONable._ignored_json_keys = _ignored_json_keys

    return json.dumps(self, indent=indent, default=_default_json_encoder, **kw)

    class X(MixinJSONable):

    pass

    x = X()

    y = X()

    setattr(x,"val",{1:2,3:4})

    setattr(y,"val",{1:2,3:x})

    y.to_json()

    将打印:

    ^{pr2}$

    展开全文
  • 本节将介绍如何自定义数据结构。先来看下,有哪些基础类型提供给我们。基础类型介绍:类型名占用Size介绍UINT81unsigned int8UINT162unsigned int16UINT324unsigned int32UINT648unsigned int64INT81int...

    自定义数据类型

    概述:

    引擎内提供一些基础类型可以直接使用,但是有些时候,用户对数据结构有一定要求,则需要自定义数据类型。本节将介绍如何自定义数据结构。

    先来看下,有哪些基础类型提供给我们。

    基础类型介绍:

    类型名

    占用Size

    介绍

    UINT8

    1

    unsigned int8

    UINT16

    2

    unsigned int16

    UINT32

    4

    unsigned int32

    UINT64

    8

    unsigned int64

    INT8

    1

    int8

    INT16

    2

    int16

    INT32

    4

    int32

    INT64

    8

    int64

    FLOAT

    4

    float

    DOUBLE

    8

    double

    VECTOR2

    12

    二维向量,如(1,2)

    VECTOR3

    16

    三维向量,如(1,3,4)

    VECTOR4

    20

    四维向量,如(1,2,3,4)

    STRING

    N

    string,占用长度随内容而变

    UNICODE

    N

    unicode,占用长度随内容而变

    PYTHON

    N

    任意python对象

    PY_DICT

    N

    python的dict对象

    PY_TUPLE

    N

    python的tuple对象

    PY_LIST

    N

    python的list对象

    ENTITYCALL

    N

    BLOB

    N

    类型别名:

    别名,顾名思义,就是用另外一个名字去命名一个已声明的类型(包括基础类型和自定义类型)。

    为什么要使用类型别名?

    开发人员可以更容易的理解类型的含义

    与实际使用的场景挂钩,更加方便理解。

    如何定义一个别名?

    和Entity的def配置文件在一个文件夹下,{项目资产库}/scripts/entity_defs/types.xml。我们举个例子:

    UINT8

    UINT64

    UINT64

    INT32

    基本看一眼,大家都明白意思了吧。在root下声明一个标签,标签名是类型名,标签里的内容就是实际的类型。如BOOL类型,其实质是使用内置基本类型UINT8。我们使用时可以直接用BOOL来作为Entity实体的属性类型。是不是比较好理解呢?我们举个实际的例子,一个Motion组件的isMoving属性:

    UINT8

    ALL_CLIENTS

    50

    BOOL

    CELL_PRIVATE

    0

    ...

    ...

    和基本类型的用法是一样的。

    一些人为协定:

    类型名使用大写

    类型名字清晰,一目了然

    两个单词之间使用下划线_分割。

    ARRAY用法:

    在自定义类型时,我们可以使用ARRAY来表明一个数组类型,比如,我们需要一个EntityID的List的类型别名,如下:

    ARRAY ENTITY_ID

    我们看到,使用ARRAY 类型名 的格式即可!

    自定义数据类型(固定字典类型-FIXED_DICT):

    顾名思义,是用户自己进行数据类型的定义。数据结构可以是一个类似于Python字典的结构,引擎可以根据用户的定义将这样一个结构的数据通过网络传输到目的地并还原成该结构,或者存储到数据库中以及从数据库中还原。

    自定义类型允许用户重定义底层数据结构在内存中存在的形式,这样能够便于用户在内存访问复杂的数据结构,甚至能够提高代码执行的效率。 所有数据类型中只有FIXED_DICT能够被用户重定义,C++底层只能识别这个类型为FIXED_DICT, 在进行识别时会依次检查字典中的key与value, C++底层通常都不会去干涉内存里存储的是什么, 但当进行网络传输和存储操作时,C++会从脚本层获取数据, 用户如果重定义了内存中的存在形式,那么在此时只要能恢复原本的形式则底层依然能够正确的识别。

    为什么要使用自定义数据类型?

    可以定义更复杂的自定义类型

    满足用户的不同业务需求

    重定义底层数据结构在内存中存在的形式,这样能够便于用户在内存访问复杂的数据结构,甚至能够提高代码执行的效率。

    自定义一个数据类型的步骤:

    1. 在types.xml文件中声明类型

    格式如下:

    FIXED_DICT

    xxx.inst

    类型名称

    类型名称>

    我们拿角色信息举个例子,一般的,我们的角色信息会包含dbid、name、level等信息。我们来看看如何进行自定义数据结构的声明:

    FIXED_DICT

    AVATAR_INFO.avatar_info_inst

    DBID

    UNICODE

    256

    UINT16

    1:FIXED_DICT 不要忘记写;

    2:implementedBy里的内容必须填写,并且对应python的实现;(python实现在下面会讲述)

    3:其他和一般的属性声明差不多。

    ok,一个角色信息的自定义数据结构就完成了。接下来,我们看看如何使用python实现它。

    2. 通过Python实现该类型

    2.1:实现模块的位置:{项目资产库}/scripts/user_type文件夹

    上图就是我们的角色信息AVATAR_INFO的实现类。

    2.2:该模块中,必须与implementedBy中填写的内容对应

    2.2.1 所在模块名和变量名必须对应;

    2.2.2 变量必须暴露出来;

    2.2.3 该变量的类型必须是一个class;

    2.2.4 该class必须有如下三个方法声明:

    def createObjFromDict(self, dict):

    """

    从一个dict创建一个对应的object

    """

    def getDictFromObj(self, obj):

    """

    从一个object创建一个对应的dict

    """

    def isSameType(self, obj):

    """

    是否同类型。

    return: bool,是否

    """

    如我们的AVATAR_INFO的implementedBy的值为AVATAR_INFO.avatar_info_inst,则必须有一个AVATAR_INFO的模块,同时有一个暴露出来的avatar_info_inst变量。同时该变量是一个class,并实现了createObjFromDict、getDictFromObj、isSameType三个方法。见下方完整的代码:

    class TAvatarInfo(list):

    """

    """

    def __init__(self):

    """

    """

    list.__init__(self)

    def asDict(self):

    data = {

    "dbid": self[0],

    "name": self[1],

    "level": self[2],

    }

    return data

    def createFromDict(self, dictData):

    self.extend([dictData["dbid"], dictData["name"], dictData["level"]])

    return self

    class AVATAR_INFO_PICKLER:

    def __init__(self):

    pass

    def createObjFromDict(self, dict):

    return TAvatarInfo().createFromDict(dict)

    def getDictFromObj(self, obj):

    return obj.asDict()

    def isSameType(self, obj):

    return isinstance(obj, TAvatarInfo)

    avatar_info_inst = AVATAR_INFO_PICKLER()

    我们使用list的基类,完成了TAvatarInfo的实现,同时用AVATAR_INFO_PICKLER来完成了上面提到的三个接口。最后把avatar_info_inst作为一个实例变量暴露出来。

    下面我们来看看这样的自定义数据类型,内存中是什么样的形式存放。

    3. 内存中的默认形式

    那我们上面的例子,我们看下AVATAR_INFO在内存是什么样的形式。

    AVATAR_INFO = [1, "kbengine", 0]

    Copyright © 2018 Yolo Technologies. Publication: 2.0-025. Built: 2018-12-07.

    展开全文
  • python高级用法,自定义数据结构,我猜你一定没使用过

    文/IT可达鸭

    图/IT可达鸭、网络

    前言

    每个学习python的人都会对这些原生的数据结构有一定的了解,python底层给我们提供了多种多样的原生数据结构,例如:list、set、dict等等。同样的,原生数据结构所定义的基本方法,也是大家所熟悉的,例如:len()、str()、int()等等。当然还有,我们最最熟悉的比较操作符,例如:>=、==、<=等等。还有运算操作符、容器操作等等。

    魔术方法

    我现在告诉你,其实上面这些原生数据结构、操作符、运算符都可以自定义,而且非常简单。在一些有趣的源码中,为了程序设计方便,会使用一些自定义的数据结构。如果你有阅读python源码的习惯,也会碰到一些奇怪的函数定义,实际调用方法却是常用原生方法。

    举个例子

    刚好最近在做项目,需要用到自定义的数据结构,就拿出这块代码来给大家分享一下。为了让初学者能更好地理解,我把业务相关的代码都去除,做一个简单的学习例子。

    场景

    在开发中,我们发现set() 这个数据结构无序的。就是不同时刻去遍历 set() 里面的数据,都会输出不同的结果。

    需求

    这里提出一个需求,设计一个像set() 一样的数据结构,但是它必须是有序的。

    实现

    首先设计一个类,这里我们用list() 来实现。分别实现三个功能:添加元素、删除元素、对元素进行排序。

    对象 set_order 初始化后,调用一下原生的str()。

    输出结果:

    很明显,这个并不是我们要的结果。我们要的是,输出集合里面的所有元素,而不是它的内存地址。那么,我们要怎么做呢?就是使用python的魔术方法,也就是函数重载。类的代码修改如下:

    再次调用str()函数

    对应的输出结果

    同样道理,我们对 len()、in 或not in、比较操作符==,进行重载。

    接下来,我们来逐个验证魔术方法的调用。

    新建两个有序set(), 并输出str()

    str()的输出结果:

    测试比较操作符

    比较操作符的输出结果:

    测试 in 和 not in 操作符

    比较操作符的输出结果

    Python中所有的魔术方法均在官方文档中有相应描述,但是官方的描述比较模糊。如果没有一个简单明了的例子,刚入门的小伙伴很难理解。

    以上,对几个常用的魔术方法做了示例。如果大家在学习过程中有遇到双下划线包起来的方法,可能就是魔术方法,可以通过本文了解如何使用魔术方法。其余的魔术方法,使用方式都是大同小异。

    结语

    学习python,不需要一杯奶茶钱,只需要你点个关注。如果觉得小编的文章对你有帮助,记得点个赞,顺便帮我分享出去。有什么不明白的地方,欢迎在下方评论,或私信小编。最后,感谢大家的阅读,祝大家生活愉快。

    本文由 IT可达鸭原创,欢迎关注,带你一起长知识!

    展开全文
  • C++自定义数据结构

    2019-10-04 16:35:54
    C++自定义数据结构 #include <iostream> void selfDefinedDataStructure() { std::cout << "自定义数据结构:" << std::endl; // 自定义Sales_data数据类型 // struct + 类名 + 类体 // 类...
  • 易语言学习调用DLL返回自定义数据结构的方法源码,test,测试子程序,RtlMoveMemory,取指针到字节集
  • 一、自定义数据结构基本定义方法 C++ 允许用户自定义自己的数据类型。数据结构是把一组相关的数据元素组织起来然后使用的方法策略。例如,本例中我们以书店的售卖书籍清单为例,构建一个名为Sale_data的数据类型,该...
  • 这样的情况下,我们可以使用自定义数据结构来定义变量,使用一个变量就可以将很多信息一同引用.下面举个例子来说明: 在标准模块中进行自定义数据结构的声明: type point x as long y as long z as long en...
  • Python自定义散列表数据结构
  • C++Primer2.6节自定义数据结构 数据结构:是互相之间存在关系的数据元素的集合。 2.6.1 自定义数据类型 1、定义:类是一种数据结构,使用关键字struct定义。具体形式:struct{…}; 2、类定义的规定: ①类内部定义的...
  • 自定义数据结构的好处在于,STL在不同平台的性能不一样,而且缺一些需要的数据结构,例如C++11之前没有HashMaps。同时专门的数据结构会比一般化的快。 Vector SmallVector 类似std::
  • 用于创建自定义数据结构的大学项目 这是我发现的哈瓦那大学(uh =哈瓦那大学)的一个旧项目,我的目标是使用更好的编码实践对其进行更新。 也许我可以用结果创建一个.Nuget包。 实施的数据结构 列表 堆 Avl 字典
  • 2.6 自定义数据结构 文章目录2.6 自定义数据结构2.6.1 定义类(struct)2.6.2 头文件的编写【预处理器概述】【#define、#ifdef、#ifndef、#endif】 2.6.1 定义类(struct) ​ 我们的类以关键字 struct 开始,紧跟着...
  • 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术...
  • 我在上一篇文章已经写过三个方法用C++给qml传入...step1:根据自己的项目需求创建自定义数据结构 step2:创建数据模型 step3:将定义的数据模型传入qml 下面详细介绍每一步 step1创建自定义数据结构 class DeviceList {
  • 实现了一个自定义数据结构 —— 树,该自定义结构不同于二叉树及其他数据结构,每个节点的子节点个数不受限制,最大限度保留了数据的原始结构,并实现了其前序和后序遍历的方法。优点是节省了内存,但缺点则是基于...
  • * 第3章 自定义数据结构 结构体共同体和枚举类型 结构体定义 将不同种类型的数据有序地组合在一起构造出一个新的数据类型这种形式称为结构体 结构体是多种类型组合的数据类型 struct 结构体名 成员列表 struct ...
  • 2.6自定义数据结构

    2018-05-09 15:27:45
    1.C++类,数据结构。类中可以包含运算功能。2.类内初始值,初始化和赋值的区别。赋值:将一个当前值差掉,用一个新值代替。初始化:创建变量时给予一个初始值。3.类内初始值不能用圆括号。(花括号或等号右边)4.类...
  • GUI/GUILayout/EditorGUILayout这几个类中没有提供自定义数据结构的显示,难道就不能像Inspector那样友好么,不然就只能使用基础元素来组合实现了。  不赘述,代码如下: public class TestClass { public ...
  • 本文展示通过序列化将自定义数据结构序列化到硬盘文件中,再从文件反序列出来还原数据信息。 Qt中序列化与反序列化 Qt中使用QDataStream类实现对象序列化; 序列化: QFile file("file.rx"); //定义文件路径 ...
  • NULL 博文链接:https://tqywork.iteye.com/blog/2394855
  • 局部变量 数据结构, 数据结构 .局部变量 标题, 文本型 标题 = 到文本 (取结构尺寸_GlobalSize (数据结构)) 调试输出 (标题) .子程序 取自定义数据长度_LocalSize .局部变量 数据结构, 数据结构 .局部变量 标题, ...
  • OHCI接口层用到的数据结构定义如下,这些数据定义都是我自己的程序里所使用的自定义数据结构,是根据OHCI的标准与程序的处理方式进行定义的: /** * USB设备信息 */ typedefstruct_USB_DEV_INFO { ...
  • 2.6 自定义数据结构

    2019-05-09 08:07:25
    书中页数:P64 代码名称:Sales_data.h 和 Sales_data.cc #ifndef SALES_DATA_H #define SALES_DATA_H #include <string> struct Sales_data { std::string bookNo;... unsigned units_sold = 0;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,655
精华内容 4,662
关键字:

自定义数据结构

数据结构 订阅