__metaclass__ 实现单列模式
class Singleton(type):
"""Singleton.
@see: http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python
"""
_instances = {} def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Earth(object):
__metaclass__ = Singleton def __init__(self,a,b): pass
if __name__ == '__main__':
e = Earth(1,2)
理解
1 类也是对象,在运行时需要被创建
2 type 和元类 为创建类的类,创建类时先找__metaclass__,找不到就由type创建
3 Singleton类中的__new__ 只会在开始运行时创建Earth类时被调用一次,以后对于Earth的实例化时先调用了Singleton的__call__方法,
第一次E的实例化S会调用super,super内调用到了E的new,init(此处为唯一一次,以后对E实例化S的call只会返回第一次生成的实例,不会调用super)
道生一,一生二,二生三,三生万物。(原文)
- 道 即是 type
- 一 即是 metaclass(元类,或者叫类生成器)
- 二 即是 class(类,或者叫实例生成器)
- 三 即是 instance(实例)
- 万物 即是 实例的各种属性与方法,我们平常使用python时,调用的就是它们。
type-->元类 --> 类 --> 实例 --> 属性与方法
元类中:
__new__ 有返回值,用于生成类
__call__ 有返回值,使类可以像函数一样被调用,返回__new__生成类的实例
type有一种完全不同的能力,它也能动态的创建类。type可以接受一个类的描述作为参数,然后返回一个类。(我知道,根据传入参数的不同,同一个函数拥有两种完全不同的用法是一件很傻的事情,但这在Python中是为了保持向后兼容性)
type可以像这样工作:
type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值)) 返回值为 类对象
__metaclass__ 实现单列模式的更多相关文章
- Java 单列模式(Singleton)
		单例模式(Singleton) 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 目的:使得类的一个对象成为系统中的唯一实例. 如何保证一个类只有一个实例并且这个实例易于被访问呢? 我们都 ... 
- 在JAVA和android中常用的单列模式
		在很多开发中,项目为了节约资源,都把一个类的构造函数变为私有化,这样整个项目中就不能创建多个实例,这样的方法我们称为单例模式 现在通过代码来简介下这个单例模式: 在新建一个java项目后,创建一个实体 ... 
- 单列模式(data与business交互)
		public class CommentsBusiness //Business { #region 单列模式 private static CommentBusiness instance; pri ... 
- 23种设计模式学习一(单列模式)singleton
		单列模式的类(单线程下的) class Singleton { private static Singleton instance; private Singleton() { } public st ... 
- java设计模式--单列模式
		java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ... 
- java基础语法(二)--单列模式
		java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ... 
- java基础(三):反射、反序列化破解单列模式和解决方式
		单例模式指的是一个类只有一个对象,通过一些措施达到达到这个目的.但是反射和反序列化可以获得多个不同的对象. 先简单的认识一下单例模式 一:单例模式 通过私有构造器,声明一个该类的静态对象成员,提供一个 ... 
- 单列模式,装饰器、new方法、类/静态方法实现单列模式
		一.单列模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 C ... 
- Java单列模式
		设计模式 单列模式的定义和作用 目的:使得类的一个对象成为该类系统中的唯一实列: 定义:一个类有且仅有一个实例,并且自行实列化向整个系统提供?: 单列模式分为 恶汉式 (在创建对象的时候就直接初始化 ... 
随机推荐
- 学习Mybatis的两个必须的jar包分享
			百度云盘:http://pan.baidu.com/s/1nuNxRcd 提取码:t765(好像不需要提取码,不太会用云盘...) 自己学习mybatis的时候去找这两个jar包也是不容易,特别分享一 ... 
- 奔跑吧DKY——团队Scrum冲刺阶段-Day 4
			今日完成任务 谭鑫:主要解决之前存在的控件不灵敏问题,导致界面跳转不顺利. 黄宇塘:制作新的游戏背景图,对主界面图进行调整. 赵晓海:主要解决之前存在的控件不灵敏问题,导致界面跳转不顺利. 方艺雯:制 ... 
- WebGL学习笔记一
			学习用来做web3D的,从第一页开始学起先做2D的,接下来的程序是一个入门级的程序,可以通过在画板上的不同位置点击而获取不同颜色的点,以画板中心为坐标原点四个象限有不同的颜色,访问地址 http:/ ... 
- Java每日编程day2
			Java每日编程day2 第一题 package com.pcx.day2; /* * 九九乘法表并逆序 */ public class JiuJiu { public static void mai ... 
- 团队C++作业1
			我的分工 在本次作业中,我负责的是建筑类的完成还有调试运行. 建筑类的完成: 首先我认为建筑类的完成中,建筑类中应该有三个成员,水晶,防御塔,泉水. 水晶在这个里头是要被保护的对象,它的功能有回血还有 ... 
- windows redis 后台运行
			1. 进入 DOS窗口2. 在进入Redis的安装目录3. 输入:redis-server --service-install redis.windows.conf --loglevel verbos ... 
- [二叉树建树&完全二叉树判断] 1110. Complete Binary Tree (25)
			1110. Complete Binary Tree (25) Given a tree, you are supposed to tell if it is a complete binary tr ... 
- iOS- 如何使用Alcatraz来高效的管理Xcode-Plugin(Xcode插件)
			1.前言 相信各位iOS攻城师用的Xocde的快捷插件也不少,今天向大家分享一款能高效快捷的管理Xcode-Plugin的软件<Alcatraz>,自己亲自体验后,爱不释手. (这里用 ... 
- 由一个滑动条的任务需求产生一个对UISlider控件的探讨
			任务需求样式: 
- exFAT移动硬盘写保护怎么去掉
			cmd命令提示符下运行chkdsk命令: 比如在E盘,则输入的命令如下: E:(冒号不可少,输入后回车) CHKDSK /F /X (回车) 等命令执行完了,即可去掉exFAT移动硬盘写的保护. 
