• 解决Python实体类数据结构创建问题
  • 支持实体类转dict
  • 支持带默认创建时间和更新时间
  • 支持属性get、set赋值
  • 支持初始化覆盖写
import json
import arrow
"""数据结构基类"""


class Base(object):
    def __init__(self, *args):
        pass

    def to_dict(self):
        obj = json.loads(self.to_string())
        return self.rename_dict(obj)

    def to_string(self):
        return json.dumps(self, default=lambda o: o.__dict__)

    # 仅支持二级字典嵌套
    def rename_dict(self, obj):
        result_dict = dict()
        for k, v in obj.items():
            if isinstance(v, dict):
                result_dict.update({k: {str(sub_k).split('__')[-1]: sub_v for sub_k, sub_v in v.items()}})
            else:
                result_dict.update({str(k).split('__')[-1]: v})
        return result_dict


# 默认包含创建时间和更新时间
class BaseInfo(Base):
    def __init__(self, *args):
        self.__create_time = arrow.now().format('YYYY-MM-DD HH:mm:ss')  # 创建时间
        if args and isinstance(args[0], dict):
            for k, v in args[0].items():
                if hasattr(self, k):  # 检查实例是否有这个属性
                    setattr(self, k, v)  # same as: a.name = 'tiger'
        self.__update_time = arrow.now().format('YYYY-MM-DD HH:mm:ss')  # 更新时间

    @property
    def create_time(self):
        return self.__create_time

    @create_time.setter
    def create_time(self, value):
        if value:
            self.__create_time = value

    @property
    def update_time(self):
        return self.__update_time

    @update_time.setter
    def update_time(self, value):
        if value:
            self.__update_time = value


# 用户信息实体类
class UserInfo(Base):
    def __init__(self, *args):
        self.id = 100         # 用户ID
        self.__sex = "男"     # 性别 set
        super().__init__(*args)

    @property
    def sex(self):
        return self.__sex

    @sex.setter
    def sex(self, value):
        if value:
            self.__sex = value


# 用户信息默认带时间实体类继承BaseInfo
class UserTimeInfo(BaseInfo):
    def __init__(self, *args):
        self.id = 100         # 用户ID
        self.__sex = "男"     # 性别 set
        super().__init__(*args)

    @property
    def sex(self):
        return self.__sex

    @sex.setter
    def sex(self, value):
        if value:
            self.__sex = value


if __name__ == '__main__':
    user_info = UserInfo()
    print(f'sex修改前:{user_info.sex}')
    user_info.sex = "女"  # 修改为女
    print(f'sex修改后:{user_info.sex}')
    print(f'实体类转dict:{user_info.to_dict()}')

    print(f'-----------------------------')
    t_info = UserTimeInfo()
    print(f'sex修改前:{t_info.sex}')
    t_info.sex = "女"  # 修改为女
    print(f'sex修改后:{t_info.sex}')
    print(f'带默认时间实体类转dict:{t_info.to_dict()}')


#sex修改前:男
#sex修改后:女
#实体类转dict:{'id': 100, 'sex': '女'}
#-----------------------------
#sex修改前:男
#sex修改后:女
#带默认时间实体类转dict:{'id': 100, 'sex': '女', 'create_time': '2020-11-07 14:42:15', 'update_time': '2020-11-07 14:42:15'}

时间arrow用法参考博文

pip install arrow
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐