66 lines
1.3 KiB
Python
66 lines
1.3 KiB
Python
|
|
#!/usr/bin/env python
|
||
|
|
# -*- encoding: utf-8 -*-
|
||
|
|
"""
|
||
|
|
Topic: 通过元类控制实例的创建
|
||
|
|
Desc :
|
||
|
|
"""
|
||
|
|
|
||
|
|
|
||
|
|
class NoInstances(type):
|
||
|
|
def __call__(self, *args, **kwargs):
|
||
|
|
raise TypeError("Can't instantiate directly")
|
||
|
|
|
||
|
|
|
||
|
|
# Example
|
||
|
|
class Spam(metaclass=NoInstances):
|
||
|
|
@staticmethod
|
||
|
|
def grok(x):
|
||
|
|
print('Spam.grok')
|
||
|
|
|
||
|
|
|
||
|
|
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
|
||
|
|
|
||
|
|
|
||
|
|
# Example
|
||
|
|
class Spam1(metaclass=Singleton):
|
||
|
|
def __init__(self):
|
||
|
|
print('Creating Spam')
|
||
|
|
|
||
|
|
|
||
|
|
import weakref
|
||
|
|
|
||
|
|
|
||
|
|
class Cached(type):
|
||
|
|
def __init__(self, *args, **kwargs):
|
||
|
|
super().__init__(*args, **kwargs)
|
||
|
|
self.__cache = weakref.WeakValueDictionary()
|
||
|
|
|
||
|
|
def __call__(self, *args):
|
||
|
|
if args in self.__cache:
|
||
|
|
return self.__cache[args]
|
||
|
|
else:
|
||
|
|
obj = super().__call__(*args)
|
||
|
|
self.__cache[args] = obj
|
||
|
|
return obj
|
||
|
|
|
||
|
|
|
||
|
|
# Example
|
||
|
|
class Spam2(metaclass=Cached):
|
||
|
|
def __init__(self, name):
|
||
|
|
print('Creating Spam({!r})'.format(name))
|
||
|
|
self.name = name
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|