虽然我用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。

用元类小题大做了吗。也可以使用装饰器来装饰类来实现数据类,装饰器不光可以装饰在函数上,也可以装饰在类上的。

最新文章

  1. 使用JMeter进行简单的压力测试
  2. setTimeout不断重复执行
  3. 解决ubuntu下安装phpmyadmin访问不了的问题
  4. NGINX原理分析 之 SLAB分配机制
  5. typedef void (*funcptr)(void)
  6. CocoaPods requires your terminal to be using UTF-8 encoding
  7. Android开发之极光推送基本步骤
  8. iOS 定位服务、通讯录、日历、提醒事项、照片、蓝牙共享、麦克风、相机等授权检测
  9. 我使用过的Linux命令之date - 显示、修改系统日期时间
  10. 去除 MyEclipse updating index
  11. Javascript常见浏览器兼容问题
  12. 在为知笔记中使用Markdown和思维导图
  13. 内存压测工具Memtester
  14. 【js】使用javascript 实现静态网页分页效果
  15. hdu 1527 (威佐夫博弈)
  16. .NET Core 中依赖注入 AutoMapper 小记
  17. GitHub上个最有意思的项目合集(技术清单系列)
  18. Win/Lin 双系统时间错误的调整 (转)
  19. 了解linux的进程:rootfs与linuxrc
  20. linux-2.6内核驱动学习——jz2440之按键

热门文章

  1. Linux c编程:线程属性
  2. Jquery 动态添加option 并给option添加数据,并帮定事件
  3. c++ 之重要性
  4. flex 组件重写 组件生命周期
  5. 【leetcode刷题笔记】Count and Say
  6. 【leetcode】Balanced Binary Tree
  7. in型子查询陷阱,exists子查询
  8. 如何用<Enter>键代替<Tab>键实现光标焦点转移?
  9. java入门了解10
  10. 总结最近写的h5项目