- 主页 > 生活百科 > >
两句话掌握 Python 最难知识点——元类出处( 七 )
class MetaSingleton(type): instance = None def __call__(cls, *args, **kw): """ this is comment """ print 'in call method' if cls.instance is None: # cls.instance = super(MetaSingleton, cls).__call__(*args, **kw) # cls.instance = type.__dict__['__call__'].__get__(cls)(*args, **kw) cls.instance = type.__call__(cls, *args, **kw) print cls.instance return cls.instance class Foo(object): __metaclass__ = MetaSingleton def __init__(self, a, b): self.a = a self.b = b a = Foo(1, 2) b = Foo(3, 4) assert a is b print a.a, a.b, b.a, b.b print type(Foo) print Foo.__call__ 例子很直接,__call__方法里面通过判断是否已经有初始化过的实例,没有就仿照正常未指定元类的情况下调用type的__call__方法(当然这里要么通过super binding要么手动指定cls上下文),生成一个Foo的实例存储和返回出来 。但是有一个注意点是,call方法每次初始化实例对象的时候都会被调用,这也和先前说的控制实例的生成一致: Python (<class '__main__.B'>, <class '__main__.A'>, <type 'object'>) in call method <__main__.Foo object at 0x00000000024BFA90> in call method <__main__.Foo object at 0x00000000024BFA90> 1 2 1 2 <class '__main__.MetaSingleton'> <bound method MetaSingleton.__call__ of <class '__main__.Foo'>> 还有一个需要在意的地方是最后的两行打印日志,Foo类型的元类是Metasingleton(调用new生成类型的时候默认指定元类是第一个参数);Foo的__call__方法是绑定了Foo(MetaSingleton的实例)实例的MetaSingleton的方法,也就是从另外的方面证实每次初始化Foo类型市里的时候,其实是在调用元类中重写的__call__方法 。 元类这个特性大多数情况下确实使用的不多并且需要稍微花点时间来理解,但是需要使用的时候会非常好用,往往能够实现很多优雅的功能,最典型的就是ORM的实现了,只不过会更加的复杂,且pythoning且学习吧,PEACE! 参考资料中的链接里面有有几个实际的例子,本文也是学习其中的内容后配合一些其它一些使用经验以及碰到的问题理而成,希望对大家有用 。【两句话掌握 Python 最难知识点——元类出处】
推荐阅读
-
科学宇宙探索者:全球变暖只会让气温上升这么简单吗?其实后果不是人类能承受的
-
-
「美国」4月30日18时,美国疫情疯狂爆发,再次创新恐怖纪录!
-
-
大电竞APP|KPL:微博公布收购TS,KPL增设临时席位KGL大规模整合
-
上海市国有资产监督管理委员会网站|上海农商银行发布长三角区域一体化服务方案 长三角金融总部揭牌
-
林志玲|林志玲首谈离婚,自曝患抑郁:结婚才3年时间,她怎么变成这样了?
-
「阿里巴巴」2020年副业“新风口”,淘小铺的全面讲解
-
蓝鲸财经京东与首旅签署合作协议,将推进线上线下深度融合
-
奶嘴妈妈育婴师|丈夫看后不想要,医生的话让两人放心,高龄产妇生了个“猪八戒”
-
-
快看|起底其详细资料以及出道背景,演员周斌的妻子是谁
-
欧洲国家联赛|今日欧国联引人注目:四星德国主场待战!二星法国远赴挑战葡萄牙
-
因素|性侵全是女生的因素?中国美术学院回应新生手册争议:考虑不足
-
曝杨幂为女找心理医生,刘丹称孙女半夜角落哭,疑因李晓峰患抑郁
-
央视新闻客户端|阿曼警方拘捕25名非法移民和18名走私者
-
遮瑕|干皮or油皮?遮瑕要怎么选才最适合你呢?精准的遮瑕测评来啦~
-
那抹微光|谁看得出这是亲兄妹?哥哥演江德福走红,妹妹三登春晚被遗忘
-
赵丽颖|赵丽颖的新剧终于定档了,33岁的赵丽颖将华丽转型,期待她的新剧
-