Python 元类使用讲解
我要一大群的类都具有一种特点,我怎么给他们加上呢?模板嘛,我从这个模板创建一群类不就OK了?那就需要元类了。
定义一个元类(就是一个类的模板!莫多想,还要记住这是类级别的,不是对象级别的!):
代码如下:
class MyMeta(type):
def __init__(cls, name, bases, dic):
print(cls.__name__)
print(name) def __str__(cls):
return "Beautiful class %s" % cls.__name__
这是个什么东西?哈,这是个元类。是个类的模板。
它要用在哪里?它要用在一个类里,作为这个类的模板。
起的什么作用?模板,就是提供一些共同的特征。
这个类提供了什么样的特征?两个特征,1。类定义后打印类的名字(__init__)。2。打印类的格式(__str__)。
到底回怎么工作,打开的你的解释器,输入以上的代码,上路:
第一个:
输入:
class MyClass(object):
__metaclass__ = MyMeta
回车结束类的定义时,输出:
MyClass
MyClass
事实证明它确实是初始化一个类,而不是一个对象!!!!!这个是第一个特征。
第二个:
输入:
print(MyClass)
输出:
Beautiful class MyClass
---测试---
下面我们来实现一个Singleton模式
Singleton元类:
代码如下:
class Singleton(type):
def __init__(cls, name, bases, dic):
super(Singleton, cls).__init__(name, bases, dic)
cls.instance = None def __call__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls.instance
非常简单的一个设计模式,相信你能明白是怎么回事!
代码如下:
class MyClass(object):
__metaclass__ = Singleton def __init__(self, arg):
self.arg = arg
使用了Singleton元类的类。
是不是只能有一个实例呢??
代码如下:
>>> my1 = MyClass("hello")
>>> my2 = MyClass("world")
>>> my1 is my2
True
>>> my1.arg
hello
>>> my2.arg
hello
我们创建my2的尝试失败了,而这恰恰证明我们成功了。
Python 元类使用讲解的更多相关文章
- python元类:type和metaclass
python元类:type和metaclass python中一切皆对象,所以类本身也是对象.类有创建对象的能力,那谁来创建类的呢?答案是type. 1.用tpye函数创建一个类 class A(ob ...
- Python 元类 - Metaclasses
Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...
- Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
- 深入理解 python 元类
一.什么的元类 # 思考: # Python 中对象是由实例化类得来的,那么类又是怎么得到的呢? # 疑问: # python 中一切皆对象,那么类是否也是对象?如果是,那么它又是那个类实例化而来的呢 ...
- python 元类
转载自 http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...
- [python]python元类
这两天在看Django框架,里面的filter实现原理搞不明白,最后发现跟python的元类有关系. 原文:http://stackoverflow.com/questions/100003/what ...
- Python元类实践--自己定义一个和collections中一样的namedtuple
大家可能很熟悉在collections模块中有一个很好用的扩展数据类型-namedtuple. 如果你还不知道这个类型,那么请翻看标准手册. 我利用元类轻松定义一个namedtuple. 先把代码贴上 ...
- python元类分析
刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下..不知道这是个啥东西... 用下面几个定义来说明吧: (1)Python中,类也是对象..仅仅只是这样的对象比較的特殊,他用于创建别的 ...
- python元类理解2
恩,对元类理解又有新的收获,其实类似于装饰器,只不过装饰器是修饰函数,元类用来定制一个类. 代码如下,这是一个使用了函数做元类传递给类: input: def upper_attr(class_nam ...
随机推荐
- 【已解决】ArcMap的界面如何恢复默认设置
解决方案:在C盘内搜索“Normal.mxt”,将它删除,然后重启ArcMap,即可. 效果图:
- Q-Q图和P-P图
一. QQ图 分位数图示法(Quantile Quantile Plot,简称 Q-Q 图) 统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们 ...
- vue-cli + webpack 环境搭建
1.下载nodeJS,官网 https://nodejs.org/en/ . 2.安装nodeJS.安装完成后可以检测node -v 如果版本号的话则正常. 3.安装淘宝镜像.npm install ...
- VUE回顾基础3
1.方法 在vue模板里函数被定义为方法来使用,将函数放在methods对象里,作为一个属性,就可以在模板里使用它 this:在方法中this指向该方法所属的组件,可以使用this方文档data对象的 ...
- 十一、vue生命周期诠释--带图
Vue 实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom→渲染.更新→渲染.卸载等一系列过程,我们称这是 Vue 的生命周期.通俗说就是 Vue 实例从创建到销毁的过程,就 ...
- hbuilder 热更新
记录下Hbuilder做热更新的功能. 首先是获取本地的版本与服务器的版本对比.服务器的版本大于本地的版本才进行更新.获取本地版本的方法 plus.runtime.getProperty(plus.r ...
- 【BBED】编译及基本命令(1)
[BBED]编译及基本命令(1) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你 ...
- php后端模式,php-fpm以及php-cgi, fast-cgi,以及与nginx的关系
关于cgi是什么,fast-cgi是什么,php-cgi是什么,fast-cgi是什么,下面这篇讲的很清楚: https://segmentfault.com/q/1010000000256516 另 ...
- SpringBoot项目打成jar在linux后台运行
--关闭客户端依然进程存在 nohup java -jar spring-boot-hello-1.0.jar 1>/dev/null 2>&1 & --Ctrl+C后不会 ...
- javascript数据结构与算法——栈
前言: 栈就是和列表类似的一种数据结构,不过栈的特点是'后人先出'.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 1. 栈的介绍: 栈是一种特殊的列表,栈内的 ...