关于python的元类,我在网上找了一下,有很多内容,现在我想把它们整理一下。
就想对象是类的实例一样,类是元类的一个实例。这一点就可以解释之前我一直看不懂的一段代码。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Singleton(type):
"""Singleton Metaclass"""
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
a = MyClass()
b = MyClass()
class Singleton(type):
"""Singleton Metaclass"""
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
a = MyClass()
b = MyClass()
这段代码在别人博客上复制过来的,之前不是很懂,现在我解释一下,免得以后忘记。首先,来看看__call__:
python 给类提供了名为__call__的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下,__call__()方法是没有实现的,这意味着大多数实例都不可调用的。然而,如果在类定义中覆盖了这个方法,那么这个类的实例就成为可调用的了。调用这样的实例对象等同于调用__call__()方法。简单的说如果类里覆盖了__call__方法,a=A(),那么a()就会去执行__call__方法。
呵呵,确实有点意思。