元类就是类的类,type就是Python中创建所有类的元类。type就是创建类对象的类。Python中所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,并且它们都是从一个类创建来,这个类就是type。
 
# class Foo(object):
 
#     a = 100
 
# # 对于上面声明类的代码,实际上是由type帮助我们创建了类,具体可以理解为下面的过程
 
#
 
# # type(类名, 基类/父类元祖, 方法与类属性 字典)  ——> 返回创建出来的类
 
# # Foo = type("Foo", (object,), {"a": 100})
 
#
 
# obj = Foo()
 
######################
 
# 使用type创建类
 
# 对象方法
 
def obj_fun(self):
 
    print("obj_fun")
 
# 类方法
 
@classmethod
 
def class_fun(cls):
 
    print("class_fun called")
 
# 静态方法
 
@staticmethod
 
def static_fun():
 
    print("static fun called")
 
# 通过type创建一个类,然后找了一个变量bar来接收
 
bar = type("Foo", (object,), {"a": 100, "o_fun": obj_fun, "c_fun": class_fun, "s_fun": static_fun})
 
# print(bar.__name__)
 
obj = bar()
 
obj.o_fun()
 
# print(type(obj))
 
#
 
# print(bar.a)
 
bar.c_fun()
 
bar.s_fun()
 
# 用函数的语法自己定义了一个元类  upper_meta_class
 
def upper_meta_class(class_name, class_bases, class_attrs):
 
    """自己定义的元类"""
 
    # class_name  用来接收类名  字符串
 
    # class_bases 用来接收基类  元祖
 
    # class_attrs 用来接收属性  字典  {"a":100, "b": 200}
 
    new_class_attrs = {}
 
    # 通过循环遍历class_attrs, 调整里面的键值对,放到new_class_attrs
 
    for key, value in class_attrs.items():
 
        new_class_attrs[key.upper()] = value
 
    # new_class_attrs = {"A": 100, "B": 200}
 
    return type(class_name, class_bases, new_class_attrs)
 
# 使用元类的方法
 
class Foo(object, metaclass=upper_meta_class):
 
    a = 100
 
    b = 200
 
# Foo = upper_meta_class("Foo", (object,), {"a":100, "b": 200})
 
# print(Foo.a)
 
print(Foo.A)
 
class upper_meta_class(type):
 
    """自定义元类"""
 
    def __new__(cls, class_name, class_bases, class_attrs):
 
        """决定了对象的真实构造过程,对象是由new方法创造出来的"""
 
        new_class_attrs = {}
 
        # 通过循环遍历class_attrs, 调整里面的键值对,放到new_class_attrs
 
        for key, value in class_attrs.items():
 
            new_class_attrs[key.upper()] = value
 
        # new_class_attrs = {"A": 100, "B": 200}
 
        # return type(class_name, class_bases, new_class_attrs)
 
        # 子类中调用父类的三种方法:
 
        #1. return type.__new__(cls, class_name, class_bases, new_class_attrs)
 
        #2. return super().__new__(cls, class_name, class_bases, new_class_attrs)
 
       3. return super(upper_meta_class, cls).__new__(cls, class_name, class_bases, new_class_attrs)
 
    # def __init__(self, class_name, class_bases, class_attrs):
 
    #     """初始化方法,对象已经存在,只是为对象进行属性设置"""
 
# python3 使用元类的方法
 
class Foo(object, metaclass=upper_meta_class):
 
    a = 100
 
    b = 200
 
#
 
# # python2 使用元类的方法
 
# class Foo(object):
 
#     ___metaclass__ = upper_meta_class
 
#     a = 100
 
#     b = 200
 
# Foo = upper_meta_class("Foo", (object,), {"a":100, "b": 200})
 
# print(Foo.a)
 
print(Foo.A)
 
就是这样,除此之外,关于元类真的没有别的可说的了。但就元类本身,它们其实是很简单的:
 
- 拦截类的创建
- 修改类
- 返回修改之后的类究竟为什么要使用元类?
“元类就是深度的魔法,99%用户根本不必为此操⼼。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。    ——Python界的领袖    Tim    Peters