class TMetaclass(type):
def __new__(cls,name,bases,attrs):
print('Metaclass new')
return type.__new__(cls,name,bases,attrs)
class T(metaclass=TMetaclass):
def __init__(self, *args, **kwargs):
print('class init')
return super().__init__(*args, **kwargs)
def __new__(cls):
print('class new')
return super().__new__(cls)
Metaclass new
alias_T =T #把类当对象,赋值 拷贝等操作
t = alias_T()
class new
class init
def echo_something(self):
print('print from new Attribute')
T.echo = echo_something #动态的给类这个变量增加成员方法(属性)
t.echo()
print from new Attribute
class Singleton(type): #这也是个类 他实例化出来的对象就是一个类
def __init__(self, *args, **kw): #
print("metaclass __init__")
self.__instance = None # 这里的self就是元类创建出来的实例,也就是类Test
super().__init__(*args, **kw)
def __new__(cls,name,bases,attrs):
print ("metaclass __new__")
return type.__new__(cls,name,bases,attrs)
def __call__(self,*args,**kw): #对元类的实例即类进行调用的时候
if not self.__instance:
self.__instance = super().__call__(*args, **kw)
return self.__instance
class Test(object,metaclass =Singleton):
def __init__(self,name): #其实只调用了一次 返回同一个对象
self.name = name
t1 = Test('Tom')
t2 = Test('Jim')
print(t1 is t2)
print(t1.name,t2.name)
metaclass __new__
metaclass __init__
True
Tom Tom
原文:https://www.cnblogs.com/ShawSpring/p/10651915.html