Python利用元类来控制实例创建
问题:
改变实例创建方式,以此来实现单例模式,缓存或者其他类似的特性。
解决方法:
如果想定制化创建实例的过程,可以通过定制一个元类并以某种方式重新实现它的__call__()方法。
使用元类的单例模式实现:
class Singleton(type):
def __init__(self, *args, **kwargs):
self.__instance = None
super().__init__(*args, **kwargs) def __call__(self, *args, **kwargs):
if self.__instance is None:
self.__instance = super().__call__(*args, **kwargs)
return self.__instance
else:
return self.__instance class Spam(metaclass=Singleton):
def __init__(self):
print("Creating Spam") a = Spam()
b = Spam()
print(a is b)
c = Spam()
print(a is c)
运行结果:
Creating Spam
True
True
不使用元类的单例模式实现:
class _Spam:
def __init__(self):
print("Creating Spam") _spam_instance = None def Spam():
global _spam_instance
if _spam_instance is not None:
return _spam_instance
else:
_spam_instance = _Spam()
return _spam_instance a = Spam()
b = Spam()
print(a is b)
c = Spam()
print(a is c)
运行结果:
Creating Spam
True
True
创建缓存实例:(不使用元类方法链接:https://www.cnblogs.com/weswes/p/10007794.html)
import weakref class Cached(type):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.__cache = weakref.WeakValueDictionary() def __call__(self, *args, **kwargs):
if args in self.__cache:
return self.__cache[args]
else:
obj = super().__call__(*args, **kwargs)
self.__cache[args] = obj
return obj class Spam(metaclass=Cached):
def __init__(self, name):
print("Creating Spam({!r})".format(name))
self.name = name def __call__(self, *args, **kwargs):
print(999) a = Spam("Guido")
b = Spam("Diana")
c = Spam("Guido")
print(a is b)
print(a is c)
运行结果:
Creating Spam('Guido')
Creating Spam('Diana')
False
True
Python利用元类来控制实例创建的更多相关文章
- python 通过元类控制类的创建
一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...
- python基础----元类metaclass
1 引子 class Foo: pass f1=Foo() #f1是通过Foo类实例化的对象 python中一切皆是对象,类本身也是一个对象,当使用关键字class的时候,python解释器在加载cl ...
- 【转】Python 之 元类
原文链接: https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python http://python.jo ...
- Python中元类
元类(metaclass) 简单地说,元类就是一个能创建类的类,而类class 是由type创建的,class可以创建对象 type与object的关系详见:python中type和object 1. ...
- 转---一文读懂 python 的元类
译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...
- Python之元类详解
一.引子 元类属于Python面向对象编程的深层魔法,99%的人都不得要领,一些自以为搞明白元类的人其实也是自圆其说,点到为止,从队元类的控制上来看就破绽百出,逻辑混乱: 二.什么是元类 一切源自于一 ...
- python中元类(metaclass)的理解
原文地址:http://www.cnblogs.com/tkqasn/p/6524879.html 一:类也是对象 类就是一组用来描述如何生成一个对象的代码. 类也是一个对象,只要你使用关键字clas ...
- 对python中元类的理解
1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object): ...
- 理解python的元类
看了一篇文档,借鉴一下!写下自己对python元类的理解,欢迎各位大神给出意见. 我的理解就是 type用来创建元类,元类用来创建类,类用来创建实例 这样一想,是不是可以认为元类创建类的过程等同于类创 ...
随机推荐
- windows下CreateDirectory创建路径失败的解决办法
第一: 权限不够: SECURITY_ATTRIBUTES sa;SECURITY_DESCRIPTOR sd; InitializeSecurityDescriptor(&sd,SECURI ...
- dubbo的重试原则
验证思路.使用超时来验证重试次数 XML 注解
- 解决DIV超出样式长度自动换行
width: 100px;display:block;word-break: break-all;word-wrap: break-word;
- POJ-1679 The Unique MST(次小生成树、判断最小生成树是否唯一)
http://poj.org/problem?id=1679 Description Given a connected undirected graph, tell if its minimum s ...
- C#匿名委托,匿名函数,lambda表达式
一.类型.变量.实例之间的关系. 类型>变量>实例 类型可以创建变量,实体类可以创建实例,实例可以存储在变量里. 二.委托使用过程: 1.定义委托(写好签名): 2.创建委托变量: 3.给 ...
- rsync+inotify实现文件实时同步
一.相关组件简介 1.rsync 与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器 ...
- 吴裕雄--天生自然 JAVA开发学习:发送邮件
import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; pu ...
- AppCompatActivity 透明背景
<!-- 背景透明样式 --> <style name="AppTheme.transparent" parent="Theme.AppCompat.L ...
- python学习笔记(22)-os文件操作模块
疑问: 如果打开操作一个文件,是用绝对路径好还是相对路径好? os模块,在lib下面,可以直接引入的,直接使用import. 一.新建一个目录,新建一个文件夹 import os #新建一个文件夹 o ...
- django框架进阶-cookie和session-长期维护
############### python基础回顾:装饰器 ################ # 装饰器非常重要,1是写代码的时候,2是面试的时候,没有python开发不问装饰器的, # ...