先有鸡还是先有蛋,this is a question。
在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。Python 中也是如此。
那么是哪个东西创建的类这个东西呢?女娲或者上帝?
尝试着站在更高的地方想这个问题(比如6楼别人的宿舍 :) )。
好吧,其实类同样也是一种对象,类对象。下面这段代码,我没有创建对象,也没有调用他,只要一运行,就会输出那句print。
1 | class Person(object): |
这就是 Python 在创建类对象。创建 Person 类的东西,称为元类。
动态的创建类
类也是对象,那么可以在运行时动态的创建他们吗?
1 | def choose_class(name): |
使用 type 创建类
type()
不仅可以查看参数是个啥类型的,还可以动态的创建类!
1 | # 语法 |
测试一下:
1 | Person = type("Person", (), {}) |
元类
元类就是用来创建类的东西。
函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类。现在你想知道那为什么type会全部采用小写形式而不是Type呢?好吧,我猜这是为了和str保持一致性,str是用来创建字符串对象的类,而int是用来创建整数对象的类。type就是创建类对象的类。你可以通过检查__class__属性来看到这一点。Python中所有的东西,注意,我是指所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。
__metaclass__ 属性
这个属性决定了这个类长什么样子,不指定的话就是使用系统默认的。
下面这段测试代码,使用自定义的函数来创建 Foo 类:
1 | def upper_attr(future_class_name, future_class_parents, future_class_attr): |
下面这段代码使用自定义的class来当做元类(代码参考:网络):
1 | #coding=utf-8 |
__metaclass__ 属性的作用?
- 拦截类的创建
- 修改类
- 返回修改之后的类