java元类_元类 - 一心不乱 - 博客园
我们使用class机制产生的类,然后在通过类产生的对象
而类实际上都是通过type来实现的
首先确定type里需要添加哪些元素
class_name = 'A' 类名
class_base = (object,) 类继承了哪些类
class_dic = {} 类体,也就是里面的属性,方法等
怎么将字符串形式的属性方法放到class_dic之中呢
可以使用exec
class_body = """
def __init__(self,name,age):
self.name = name
sefl.age = age
def say(self):
print('haha')
"""
exec(class_body,{},class_dic) 将class_body里面的字符串星是的方法执行一遍然后放到后面的class_dic字典中,而中间的{}是你的字符串形式的函数中引用了全局的函数或者变量时需要在里面加入
A = type(class_name,class_base,class_dic)
只有继承了type的类才是元类,元类运行时会先造一个空对象__new__(cls,**args,**kwargs)这个方法比init更先执行cls是Mymeta,args就是class_name,class_base,class_body,然后调用自己的init方法,然后返会初始化好的对象:
class Mymeta(type):
def __init__(self.class_name,class_base,class_body)
if not class_name istitle():
raise NameError('首字母必须大写') 一般A的首字母不是大学就会报错,相当于自定制下面类生成要满足的条件,不然就会报错
def __new__(cls,**args,**kwargs):
return super().__new__(cls,**args,**kwargs) 或者 type.__new__(cls,*args,**kwargs) 因为自己写了一个new方法如果不返会一个对象那会就什么都不会发生,而我们自己又不会造对象,所以需要继承父类type的__new__方法来造
class A(object,metaclass=Mymeta):
def __init__(self,name,age):
self.name = name
self.age = age
def say(self):
print('{0}{1}'.format(self.name,self.age))
在定义A这个类的时候因为指定了metaclass,所以会将自己的类名A,继承的对象object这里要手写不然不会传入,以及下面的类体分成3个参数传给元类Mymeta,,而self就是A这个类
raise NameError('首字符必须大写') 这个是自定义报错
__call__方法:
class Foo:
def __init__(self):
pass
def __call__(cls,*args,**kwargs):
return 123
obj = Foo()
obj() 想让对象加括号运行就需要在这个对象的类里加一个__call__方法
当用元类造了一个类的时候,列如元类Mymeta,造的类Foo
Foo生成的对象访问属性的时候是不会找到元类去的
但如果让Foo访问属性在自己这里找不到会去找元类Mymeta的
还有Foo生成对象挑用元类的call方法,里面如果直接写成object.__new__(self) ,这时候Foo里如果没有__new__是不会去找其他父类的,而是直接是用object,换成self.__new__(self)
java元类_元类 - 一心不乱 - 博客园相关推荐
- java 粒子滤波_粒子滤波 - gary_123 - 博客园
跟着博主http://blog.csdn.net/heyijia0327/article/details/40899819一起学习 尽管利用高斯逼近能有效解决许多滤波问题,但当滤波分布为多模型或某些状 ...
- java 分部类_分部类 - Tekkaman - 博客园
[分部类] 可以将类或结构.接口或方法的定义拆分到两个或多个源文件中.每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.如: 使用partial的几个要点: 1.所有部分都必须 ...
- java数字常量_数字常量 - javawebsoa - 博客园
数字常量 shell脚本在默认情况下都是把数字作为10进制数来处理, 除非这个数字采用了特殊的标记或者前缀. 如果数字以0开头的话那么就是8进制数. 如果数字以0x开头的话那么就是16进制数. 如果数 ...
- java 透传_透明传输 - javaadu - 博客园
发送方和接收方数据的长度和内容完全一致,相当于一条无形的传输线. 关于透明传输的问题 透明传输就是在传输过程中,对外界透明,就是说你看不见他是传送网络不管传输的业务如何,我只负责将需要传送的业务传送到 ...
- (myconnpy出现,pymysql可以入冷宫了)打个小补丁,让pymysql正确处理日期类型和NULL类型 - MK2 - 博客园...
(myconnpy出现,pymysql可以入冷宫了)打个小补丁,让pymysql正确处理日期类型和NULL类型 - MK2 - 博客园 (myconnpy出现,pymysql可以入冷宫了)打个小补丁, ...
- java 使用webmagic 爬虫框架爬取博客园数据
java 使用webmagic 爬虫框架爬取博客园数据存入数据库 学习记录 webmagic简介: WebMagic是一个简单灵活的Java爬虫框架.你可以快速开发出一个高效.易维护的爬虫. ht ...
- 随机数是骗人的,.Net、Java、C为我作证 - 杨中科 - 博客园
移动端全链路跟踪保障体系 随机数是骗人的,.Net.Java.C为我作证 - 杨中科 - 博客园
- java代码画樱花飘落_一行代码引入博客园樱花飘落特效
前言 博客园作为面向大众的博客, 个性新颖可以博得一赞, 简约美观也不失阅读体验, 本文对樱花特效js进行了解读, 发现作者的设计确实秒不可言, 即使没有注释, 思路展示的也很清晰. 那就废话不多说, ...
- 限制会话id服务端不共享_会话控制 - able-woman - 博客园
会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段.而会话,就是用户通过浏览器和服务器的一次通话. 为什么要有会话控制? 因为HTTP协议是无状态的,服务器不知道用户上一次做 ...
- Java实现 第三方的验证码发送问题--博客园老牛大讲堂
简要:本篇文章,主要介绍怎样利用第三方平台实现短信验证码的发送问题.--博客园老牛大讲堂 1.Java发送(验证码,短信)原理--博客园老牛大讲堂 1.首先用户选定一个第三方平台. 2.进行一系列操作 ...
最新文章
- linux下rpm包和命令使用简介
- 包红b2c模块 flutter与原生交互
- 小强学渲染之OpenGL渲染管线详析
- [密码学] ElGamal加密算法与离散对数
- python文件中环境声明_Python环境构建
- 数据库-优化-数据库结构的优化-拆分优化
- Java WebService 接口的简单生成和调用
- linux raw设备格式化,SUSE Linux 10配置裸设备(raw devices)
- springboot health检查
- 生成六位验证码python代码
- linux网络文件系统包括,Linux文件系统
- python读取行、分割、存储_Pytables / Pandas:组合(读取?)按行分割的多个HDF5存储...
- mysql 分页_百万数据下mysql分页问题
- cad2016中选择全图字体怎么操作_换台电脑,PPT字体就崩了?你需要这篇文章!...
- 求助:为什么我用360浏览器和UC浏览器打不开JAVA中的index.html文件? 一打开就显示浏览器首界页...
- 洛谷试炼场 普及组 动态规划的背包问题
- java计算机毕业设计高考填报信息系统源码+数据库+系统+lw文档+部署
- Spring Configuration Check Unmapped Spring configuration files found.Please configure Spring
- hr面试十大经典提问
- 计算机学硕专硕的区分,跟大家说说学硕、专硕、如何区别以及涉及到的一些政策问题...
热门文章
- 【jquery】 随笔记录
- scrapy简单爬虫
- Java字符串流学习
- 并发编程-concurrent指南-原子操作类-AtomicInteger
- 为了搞懂什么是区块链,我都快抑郁了(转)
- Mysql基础--表的操作
- C#调用Dephi接口方法
- 解决log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding?的问题
- 【报告分享】2020-2021虎嗅洞察报告:聚焦私域流量,洞察增长变局.pdf(附下载链接)...
- 【实践】文本相关性和知识蒸馏在知识蒸馏中的应用实践