元类就是类的类,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