在python3.6下 发明一个类似python3.7 dataclass数据类,不用在 __init__中self.xx
虽然我用3.6,但我在2.7转3.6时候,把3.3 3.4 3.5 3.6的变化都看了一次,虽然已经忘了哪些变化。同时也关注3.7 3.8的变化,3.7中就有1个数据类印象深刻,因为之前在定义这种类时候,我基本上是按照如下截图做的,self.xx。
py 3.7数据类介绍

数据类比字典和具名元祖都强大,规范更好,更容易补全,因为pycharm能自动补全,基本不会出现打错字母的情况。
为什么不
class A():
x = None
y= None
这样做呢,因为这样写的x和y都是类属性,不是实例属性,类在解释器是唯一的,类 属性也是唯一的,基本上要实现多实例互补干扰,必须使用实例化类后的多个对象,这样每个对象的实例属性才是互不干扰的。
如果不想
class A():
def __init__():
self.x = None
self.y = None
每次定义数据类都要加个self,那么就应该发明一个数据类。
选择元类实现是一个不错的选择。
# -*- coding: utf-8 -*-
# @Author : ydf
# @Time : 2019/6/12 17:25
import copy
import json
from app.utils_ydf import simple_logger class DataMetaclass(type): def __call__(self, *args, **kwargs):
instance = super().__call__(*args, **kwargs)
instance.__dict__ = copy.deepcopy({k: v for k, v in self.__dict__.items() if not k.startswith('__')}) # 类属性天然自带其他几个__的属性。
return instance class DataClassBase(metaclass=DataMetaclass):
def get_dict(self):
return self.__dict__ def get_json(self):
return json.dumps(self.__dict__) def __str__(self):
return f"{self.__class__} {json.dumps(self.__dict__)}" if __name__ == '__main__':
# 实例属性和类属性隔离。 class ShopItem(DataClassBase):
a = 1 shop_item = ShopItem()
shop_item.a = 2
simple_logger.debug(shop_item) shop_item = ShopItem()
simple_logger.debug(shop_item)
shop_item.a = 3
simple_logger.debug(shop_item) simple_logger.debug(ShopItem.a) # print(shop_item.__dict__)

这样就达到效果了。既不用写self,但又做到了类属性和各对象实例属性的隔离。
使用元类时候,定义元类里面的self,self代表的是类,和普通的类创建对象,self指的是改类的对象不一样。所以思维要降维。
元类一般来说是用来控制创建类的行为,写__new__ 写 __init__改变(增加)类的属性和方法,但要改变该类实例化的对象的创建行为,那就要使用__call__了,元类的__call__,就改变了普通类的__new__,思维要降维,元类是创建类的类,普通类是创建对象的类。实例的类型是类名,类的类名是type。
用元类小题大做了吗。也可以使用装饰器来装饰类来实现数据类,装饰器不光可以装饰在函数上,也可以装饰在类上的。
在python3.6下 发明一个类似python3.7 dataclass数据类,不用在 __init__中self.xx的更多相关文章
- mac下的一个类似“_kbhit()”实现
#include <sys/select.h> #include <termios.h> #include <sys/ioctl.h> int _kbhit() { ...
- 一个php将数据库的数据导出到excle表格中的小dome
首先我们需要下载个PHPExcel,PHPExcel下载地址链接:https://pan.baidu.com/s/1nxpAc45 密码:qgct 下面来写个dome: <?php //把数据写 ...
- 在Python3.5下安装和测试Scrapy爬网站
1. 引言 Scrapy框架结构清晰,基于twisted的异步架构可以充分利用计算机资源,是爬虫做大的必备基础.本文将讲解如何快速安装此框架并使用起来. 2. 安装Twisted 2.1 同安装Lxm ...
- python3.4下遍历文件目录,不需要再特殊处理中文编码
python3.4下遍历文件目录,不需要再特殊处理中文编码 直接使用os.walk来遍历中文目录. os.walk方法返回的是一个三元 tupple(dirpath, dirnames, filena ...
- CentOS7 下源码安装 python3
CentOS 7 下源码安装 python3 在CentOS7下,默认安装的是python2.7:为满足项目要求,安装python3 的方法如下: 1. 首先安装python3.6可能使用的依 ...
- 【转】Windows下安装python2和python3双版本
[转]Windows下安装python2和python3双版本 现在大家常用的桌面操作系统有:Windows.Mac OS.ubuntu,其中Mac OS 和 ubuntu上都会自带python.这里 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- 解决 在 WINDOWS 下 同时安装 python2 python3 后 pip 错误
再之前同时安装 python 后 只需把环境变量PATH 里面改为 PATH=C:\Python36-32\Scripts\;C:\Python36-32\;C:\Python27\;C:\Pytho ...
- linux下切换python2和python3(转)
0x00 为什么需要有两个版本的Python Python2和Python3不兼容是每个接触过Python的开发者都知道的事,虽说Python3是未来,但是仍然有很多项目采用Python2开发.Lin ...
随机推荐
- 如何在ubuntun中安装intellij idea 2018并破解
相比eclipse软件,intellij idea的操作更方便.功能更多,几乎集成了所有的java框架. 安装步骤如下: 1 在https://www.jetbrains.com/idea/网站上下载 ...
- 常见数据挖掘算法的Map-Reduce策略(2)
接着上一篇文章常见算法的mapreduce案例(1)继续挖坑,本文涉及到算法的基本原理,文中会大概讲讲,但具体有关公式的推导还请大家去查阅相关的文献文章.下面涉及到的数据挖掘算法会有:L ...
- Asp.Net网站统一处理错误信息
1.创建Global.asax文件 2.在Application_Error里统一处理,可以写入文件,也可以写入SQL.代码如下 Exception ex = Server.GetLastError( ...
- redis于spring整合之RedisTemplate
原文地址: http://www.jianshu.com/p/7bf5dc61ca06
- java 泛型的简单使用
effecttive java一直推荐使用泛型,简单的看了一下泛型的使用 package cn.com.fzk; import java.util.ArrayList; import java.uti ...
- 基于WebServices简易网络聊天工具的设计与实现
基于WebServices简易网络聊天工具的设计与实现 Copyright 朱向洋 Sunsea ALL Right Reserved 一.项目内容 本次课程实现一个类似QQ的网络聊天软件的功能:服务 ...
- java面试_数据库
1.group by 根据表里的字段名分类,相同字段名只显示一行记录,通常与聚集函数max.min合用选择最大值最小值,或者与having合用筛选,结果按照group by的字段排序 例:select ...
- URL重定向之一.htaccess文件和AllowOverride指令
通常利用Apache的rewrite模块对URL进行重写的时候,rewrite规则会写在 .htaccess文件里.但是要使Apache能够正常读取 .htaccess文件的内容,就必须对 .htac ...
- wget 监控web服务器
wget --timeout=$timeout --tries=$times $url -q &>/dev/null --timeout=number 设定超时时间 --tries=nu ...
- [转] 在Mac上搭建React Native开发环境
原文链接: http://blog.csdn.net/xiangzhihong8/article/details/53914336 概述 前面我们介绍过在window环境下开发React Native ...