Python 使用元类控制实例的创建 问题
你想通过改变实例创建方式来实现单例、缓存或其他类似的特性。
Python 使用元类控制实例的创建 解决方案
Python程序员都知道,如果你定义了一个类,就能像函数一样的调用它来创建实例,例如:
如果你想自定义这个步骤,你可以定义一个元类并自己实现 __call__()
方法。
为了演示,假设你不想任何人创建这个类的实例:
这样的话,用户只能调用这个类的静态方法,而不能使用通常的方法来创建它的实例。例如:
现在,假如你想实现单例模式(只能创建唯一实例的类),实现起来也很简单:
那么Spam类就只能创建唯一的实例了,演示如下:
最后,假设你想创建缓存实例。下面我们可以通过元类来实现:
然后我也来测试一下:
Python 使用元类控制实例的创建 讨论
利用元类实现多种实例创建模式通常要比不使用元类的方式优雅得多。
假设你不使用元类,你可能需要将类隐藏在某些工厂函数后面。 比如为了实现一个单例,你你可能会像下面这样写:
尽管使用元类可能会涉及到比较高级点的技术,但是它的代码看起来会更加简洁舒服,而且也更加直观。