一.元类
??? ????元类
??? ? ?元类就是类的类,python中函数type实际上是一个元类。type就是Python在背后默认用来创建所有类的元类。Python中所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。ype就是Python的内建元类,当然了,也可以创建自己的元类。
# 传统方式创建类
class Foo(object):
v1 = 123
def func(self):
return 666
# 非传统方式创建类
Foo = type("Foo", (object, ), { "v1":123, "func":lambda self:666 })
print(Foo) # <class '__main__.Foo'>
类默认由type(python内建元类)创建,怎么样类的创建改成其他元类呢? 自定义一个元类,然后在创建类时指定。
# 自定义type方法
class Mytype(type):
# 改 __init__方法是用来初始化类的
def __init__(self, *args, **kwargs):
# 调用 type 的 __init__ 方法
# 创建类时可以进行扩展
super().__init__(*args, **kwargs)
# 该__new__方法是用来创建类的
def __new__(cls, *args, **kwargs):
# 创建类时可以进行扩展
new_cls = super().__new__(cls, *args, **kwargs)
return new_cls
# 当 Mytype() ==> ( Mytype + () ) 时被调用
def __call__(self, *args, **kwargs):
# 创建对象进行扩展
# 调用当前self 指向的类 去 创建对象
empty_object = self.__new__(self) # self ==> cls 平常所见的cls代表类,self 代表当前指向的类
# 调用当前self 指向的类 去 初始化对象 传进参数为 empty_object 对象 这时类里的self --> empty_object 对象
self.__init__(empty_object, *args, **kwargs)
return empty_object
"""
可以先这么理解:
假设Foo是一个对象,由Mytype创建
Foo 类其实是 Mytype 的一个对象
Foo() -- Mytype() --> 调用 Mytype的__call__方法
"""
class Foo(object, metaclass=Mytype):
def __init__(self, name):
self.name = name
|