def record_factory(cls_name, field_names):
try:
field_names = field_names.replace(',', ' ').split()
except AttributeError:
pass
field_names = tuple(field_names)
def __init__(self, *args, **kwargs):
attrs = dict(zip(self.__slots__, args))
attrs.update(kwargs)
for name, value in attrs.items():
setattr(self, name, value)
def __iter__(self):
for name in self.__slots__:
yield getattr(self, name)
def __repr__(self):
values = ', '.join('{}={!r}'.format(*i) for i
in zip(self.__slots__, self))
return '{}({})'.format(self.__class__.__name__, values)
cls_attrs = dict(__slots__ = field_names,
__init__ = __init__,
__iter__ = __iter__,
__repr__ = __repr__)
return type(cls_name, (object, ), cls_attrs)
# 为了控制类的创建和初始化, 元类将覆盖__new__和__init__方法
class MetaSingleton(type):
_instance = {} # 用字典维护, 其它类不会是同一个
def __call__(cls, *args, **kwargs):
if cls not in cls._instance:
cls._instance[cls] = super(MetaSingleton,
cls).__call__(*args, **kwargs)
return cls._instance[cls]
class Logger(metaclass=MetaSingleton):
def __init__(self, x, y):
self.x = x
self.y = y
logger1 = Logger(5, 6)
logger2 = Logger(2, 3)
print(logger1, logger2, logger1.x, logger2.x)
近期评论