博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 元类
阅读量:7025 次
发布时间:2019-06-28

本文共 1667 字,大约阅读时间需要 5 分钟。

基本概念

一个class 本身自己也是一个对象,是type类型的对象。

class -> create instance
metaclass -> create class

普通类,可以生成一个实例的类。

元类,可以生成一个普通类(class)的类;

执行type方法,可以生成一个普通类。

type方法

type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

类名-》我是谁父类-》我从哪里来包含的属性-》我能去哪里复制代码
My_create_class = type('My_create_clas',(),{})myinstance = My_create_class()print(type(myinstance))print(myinstance)print('+'*30)print(type(My_create_class))print(My_create_class)复制代码
# 运行结果
<__main__.My_create_clas object at 0x03256CB0>++++++++++++++++++++++++++++++
复制代码

metaclass属性

当为一个普通类指定metaclass属性时,会调用元类来生成该类。 该类,父类,模块层数,任何一个有改掉属性,都会先调用metaclass属性来生成该类

def upper_attr(class_name, class_parents, class_attr):    print('metaclass work')    attrs = ((name, value) for name, value in class_attr.items() if not name[0:2] == ('__'))    upper_attrs = dict((name.upper(), value) for name, value in attrs)    return type(class_name, class_parents, upper_attrs)class Foo(metaclass = upper_attr):    bar = 'test'print(hasattr(Foo,'bar'))  # Falseprint(hasattr(Foo,'BAR'))  # True复制代码

从参考链接中作者的内容来看,虽然用函数的方式也能实现,但是使用metaclass实现OOP编程会好一些。

class Upper_attr(type):    def __new__(cls, name, parents, dct):        attrs = ((key,value) for key,value in dct.items() if not key[0:2] == '__')        upper_attrs = dict((key.upper(),value) for key,value in attrs)        return super(Upper_attr,cls).__new__(cls,name,parents,upper_attrs)class Foo(metaclass=Upper_attr):    bar = 'test'# f = Foo()print(hasattr(Foo, 'bar')) # Falseprint(hasattr(Foo, 'BAR')) # True复制代码

从参考链中看到这几个字,恍然大悟

  • 拦截类的创建
  • 修改类
  • 返回修改后的类

经过元类之后的类,就是我们普通使用的类了,可以用来创建实例。

对于简单的类, 参考链接给出了下面两种技术来修改类。 class decorators 装饰器

Monkey patching 猴子补丁

参考:

转载地址:http://xjmxl.baihongyu.com/

你可能感兴趣的文章
Codeforces Round #309 (Div. 2) B. Ohana Cleans Up
查看>>
用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
查看>>
android Recyclerview仿京东,滚动屏幕标题栏渐变(启动页面动画)
查看>>
C语言之数值计算--级数算法
查看>>
C++之引用
查看>>
MFC学习笔记之三(粒子系统+怪物简单AI+碰撞检测)
查看>>
ios xmpp研究探索:发送文本消息
查看>>
费用流模板
查看>>
Makefile规则详解
查看>>
明星讲师心石闪耀ArchSummit大会 | 手机淘宝构架演化实践
查看>>
【Android开发】网路编程及Internet应用-从指定网站上下载文件
查看>>
PHP7源码笔记一
查看>>
扩展欧几里得算法求方程特解
查看>>
Android屏幕适配思路总结
查看>>
基于刮刮卡Vue组件发布一个NPM包
查看>>
QPM 之缘起
查看>>
实现Android监控任意控件或按键双击事件方法
查看>>
2018年终总结_四年计算机科班学习经验分享+半年工作感悟 | 掘金年度征文
查看>>
国外五个免费版权音乐网站
查看>>
python中对文件的操作
查看>>