不会很常用,在ORM这种复杂结构中会遇到,同时在看一些框架源代码的过程中可能会遇到很多元类的实例,看起来很晦涩。推荐Stack overflow 一些专业解答,也可以参考下这篇博客的深刻理解,很详细。
- str是用来创建字符串对象的类
- int是用来创建整数对象的类
- type就是创建类对象的类
通过type函数动态创建类
# type的语法
type(class_name, class_parents, class_attr_dict)
"""
class_name: 类名
class_parents: 父类的元组(针对集成的情况,可为空)
class_attr_dict: 包函属性的字典
"""
eg:
class MyClass(object):
pass
MyClass = type('MyClass', (), {
'foo':True})
元类:就是能够创建python中类这种对象的东西,如type就是Python的内建元类
MyClass = MetaClass() # 元类的创建
my_class = MyClass() # 类的实例
实际上Myclass就是通过type()来创建出的MyClass类,它是type()类的一个实例。
同时,MyClass本身也是累,也可以创建自己的实例my_class。
- metaclass
可以再写一个类的时候为其添加__metaclass__属性,这样就定义了这个类的元类。__metaclass__实际上可以被任意调用,它并不需要是一个正式的类。
# py2
class Foo(object):
__metaclass__ = something
# py3
class Foo(metaclass=something):
__metaclass__ = something
- 自定义元类
元类的主要目的为了当创建类时能够自动改变类,通常,你会为API做这样的事情,你希望可以创建符合当前上下文的类。
- 可以使用函数当做元类
# 元类通常会将你传给type的参数作为自己的参数传入
def upper_attr(future_class_name, future_class_parents, future_class_attr):
"""返回一个类对象,将属性都转为大写形式"""
# 选择所有不以'__'开头的属性
attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))
# 将他们转化为大写形式
uppercase_attr = dict{
(name.upper(), value) for name, value in attrs}
# 通过type来做类对象的创建
return type(future_class_name, future_class_parents, uppercase_attr