目录
一、什么是元类?
创建类
# 定义类
class Foo(object):
def __init__(self,name):
self.name = name
# 根据类创建对象
# 1、执行类的new方法,创建对象(空对象)【构造方法】{}
# 2、执行类的init方法,初始化对象 【初始化方法】{name:"小贾"}
obj = Foo("小贾")
问题:对象根据类创建的,那类是谁创建的?
答案:类是由type创建。
# 传统⽅式创建类
class Foo(object):
v1 = 123
def func(self):
return 666
foo = Foo()
print(foo.v1) # 123
# 非传统方式(使用type)
# 创建类
# - 参数1:类名
# - 参数2:继承类
# - 参数3:成员
Fa = type("Foo", (object,), {"v1": 123, "func": lambda self: 666})
# 创建对象
obj = Fa()
print(obj.v1) # 123
result = obj.func()
print(result) # 666
类默认是以type创建。怎么让其它东西来创建类呢?(元类)。
元类:指定某个类由谁来进行创建。
# type 创建Foo类
class Foo(object):
pass
# 其他的东⻄创建类
class Foo(object, metaclass=其他的东⻄)
pass
实现方式是我们自定义一个type,然后继承type。
class MyType(type):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __new__(cls, *args, **kwargs):
new_cls = super().__new__(cls, *args, **kwargs)
return new_cls
def __call__(self, *args, **kwargs):
# 调⽤⾃⼰的那个类 __new__ ⽅法去创建对象
empty_object = self.__new__(self)
# 调⽤你⾃⼰的__init__ ⽅法取初始化
self.__init__(empty_object, *args, **kwargs)
return empty_object
class Foo(object, metaclass=MyType):
def __init__(self, name):
self.name = name
# 假设Foo是⼀个对象 由MyType创建
# Foo其实是MyType的⼀个对象
# Foo() -> MyType对象()
v1 = Foo("小贾")
print(v1)
print(v1.name)
此段代码的意思是:
因为我们类默认都是type创建,但现在我们不想用type,想用我们自定义方式创建。
我们先创建MyType作为元类,通过MyType创建Foo类。
当我们没有v1 = Foo("小贾")这句代码,只有Foo类的时候,调用的是new和init。
当我们写v1 = Foo("小贾"),调用的是元类的call,也就是MyType的call,因为Foo实际上属于MyType。
二、单例模式
元类的方式
class MyType(type):
def __init__(self, name, bases, attrs):
super().__init__(name, bases, attrs)
self.instance = None
def __call__(self, *args, **kwargs):
# 1判断是否有对象, 有则不创建
if not self.instance:
self.__init__(self.instance, *args, **kwargs)
return self.instance
class Singleton(object, metaclass=MyType):
pass
class Foo(Singleton):
pass
v1 = Foo()
v2 = Foo()
print(v1 == v2) # True