在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 ...
随机推荐
- Spring 拦截器——HandlerInterceptor
采用Spring拦截器的方式进行业务处理.HandlerInterceptor拦截器常见的用途有: 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 2 ...
- Swift学习 --- 2.1基础部分
1.swift 能够省去; 2.println与print的差别就是一个能够换行一个不能够 3.swift省去了.h与.m 直接一个swift文件 4.元组能够返回多个值,元组(tuples)把多个值 ...
- PAT 天梯赛 L2-009. 抢红包 【排序】
题目链接 https://www.patest.cn/contests/gplt/L2-009 思路 用结构体存储,然后结构体排序 注意一下 个人编号是从 1 开始 计数的 AC代码 #include ...
- codeforces 54A
题意:收到礼物的规则为每个假日必收到一份礼物,每K天里至少收到一份礼物,求出N天中收到的礼物的最小数量. 思路:将N天根据假日所在天数分为一段段,当假日与假日之间间隔天数hol[i]>-hol[ ...
- Bootstrap(二)段落+强调内容
在Bootstrap中为文本设置了一个全局的文本样式(这里所说的文本是指正文文本): 1.全局文本字号为14px(font-size). 2.行高为1.42857143(line-height),大约 ...
- 3.微信小程序-B站:wxml和wxss文件
WXML WXML(WeiXin Markup Language)是微信的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. (小安娜:好像很厉害的样子,那基础组件.事件系统是什么?感觉更厉 ...
- android 真心话大冒险 摇色子
android 真心话大冒险 摇色子 软件
- Cocos2d-x中常用宏的作用
1. CC_SYNTHESIZE(int, nTest, Test); 相当于: protected: int nTest; public: virtual nTest getTest(void) c ...
- js 跨域复习 window.name | window.domain | iframe | Jsonp
引起跨域的原因: 浏览器的同源策略,但是当你要发送请求的时候,出于安全性问题,浏览器有严格的要求,必须协议,域名,端口都相同,这个就是同源策略. 影响:a通过js脚本向b发送ajax请求,不同源就会报 ...
- php: 0跟字符串做比较永远是true。 php大bug。
php: 0跟字符串做比较永远是true. php大bug. 如: $a = 0; if( $a == 'excel') { echo "yes"; }else{ echo &qu ...