python单例类_Python单例模式(元类实现) | 学步园

最近要用到Python的单例模式,在网上找了些方法。其中使用元类实现十分简洁,也很好用。

因为单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的。

其中代码如下:

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

下面谈谈本人的理解:

在Python中一切皆对象(类(而不仅仅是类的实例)也是对象,比JAVA还彻底哈),

而元类是用来创建其它类的类,默认如果没有指定一个类的__metaclass__熟悉,系统会默认指定type为它的元类。

例如定义一个类Myclass

class MyClass(object):

pass

就相当于调用了

MyClass = type('MyClass', (), {})

也就是说MyClass是一个对象。

例外还需要讲讲类的__call__方法,这有一个帖子讲的比较详细

当一个实例当方法用,而不是调用该实例的方法时,就会调用该实例(类也是实例,例如上面的MyClass)的__call__方法。

现在,让我们重新来理解帖子开始所讲的单例模式的代码,MyClass指定了其__metaclass__属性为Singleton;则定义MyClass就相当于调用了Singleton('MyClass',(),{}),这里Singleton是实例(元类)当做方法调用则会调用其__call__方法。

在这个例子中,MyClass = Singleton(‘MyClass’,(),{}) ,MyClass是一个Singleton对象;

当定义myClass1 = MyClass(),MyClass作为一个对象,当其当方法用是就会调用__call__方法。MyClass(Singleton对象)只有一个instance对象(即MyClass对象),所以MyClass始终只能够实例化一个对象,即实现了单例模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值