python当中__metaclass__探讨
admin
2023-07-31 00:47:48
0

最初博主是希望在python当中创建一个单列模式的类,因为python当中不像java和php当中有权限修饰符(private),所以实现起来要绕一点。

网上找了一下python实现单列模式,类似的大概有这种方法:

1234567891011121314151617181920212223 class singleton(type):    \”\”\”    实现单列模式的元类    总之,metaclass的主要任务是:    拦截类,    修改类,    返回类    \”\”\”     def __init__(cls,classname,parrentstuple,attrdict):        \”\”\”        \”\”\”        super(SigleInstance,cls).__init__(classname,parrentstuple,attrdict)        cls._instance = None     def __call__(self,*args,**kargs):        \”\”\”        \”\”\”        if self._instance:            return self._instance        else:            self._instance = super(SigleInstance,self).__call__(*args,**kargs)            return self._instance

这就是单列的元类,我把它小写了,因为type也是小写的。然后呢,在即将要实现单列的class当中这样写:

1234 class Earth(object):    __metaclass__ = singleton    def __init__(self,a,b):        pass

这样每次 创建一个 Earth()取得的始终都应该是一个实例。

关于__metaclass__ 和type这个东西可以参考深入理解Python中的元类(metaclass)。这篇文章解决了我大部分的疑惑,但是我还是没有搞清楚的是:

当__metaclass__是一个类的时候,metaclass是怎样去创建一个类的?

在这之前首先说明一下:

一。python当中一切都是对象,而对象都是由类创建,这里为了区分概念,我们不妨换一种说法:实例都是由模板创建的。

二。那么什么又是对象的type呢?type就是类型的意思。如果您对java稍微有一点了解。你会有这样的认识:

12345 /*** language是一个String类型的变量,值为\”python\”* 在java当中,如果 Integer language = \”python\”就是错误的*/String language = \”python\”;

由于python是一门动态语言,所以在写代码的时候不必声明变量的类型,也不可能完全确定这个变量是什么类型,除非对自己代码的逻辑以及流程非常清楚,另外python在运行当中变量的类型是可以更改的。但是不能确定变量的类型,不代表就没有类型啊。python当中的变量一样是有类型的。那么怎么来看变量的类型呢?答案是使用type。

123456789101112131415 language = \”python\”print type(language)# python2.7中输出:# ipython 输出 str number = 2print type(number)#输出: class A(object):    pass a = A()print type(a)#输出:

上面段代码分别用type查看到了各个变量的类型。根据(一)【python当中一切都是对象,而对象都是由类创建,这里为了区分概念,我们不妨换一种说法:实例都是由模板创建的】我们可不可以这样说呢:language是str的实例,str是language实例的模板。因此type(a_var)的输出就是a_var这个实例的模板。所以我们看到 type(a)的输出是,也就是说 a实例的模板是A。

class A的模板是什么呢?

12 print type(A)#输出:

也就是说,一个类的模板的type,类是type的一个实例,tpye实例化了一个对象,这个对象就是class。所以在python的世界里,一切都是对象,类也是对象。

那么有意思的地方来了,type的模板是什么呢,也就是,type的type是什么呢?

12 print type(type)# 输出

是不是很有意思,type的type是type。很绕,换成大白话说:type的模板是type自己。那么是不是就可以这样说呢?TYPE(type,为了区分说明,故意大写)是type的模板,type是TYPE的实例,因此说明type是一个实例;而TYPE是一个模板,也就是一个类!,因为TYPE==type,那么可以得出结论:

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...