Python type函数:动态创建类

我以前学过使用 type() 函数可以查看变量的类型,但如果你想使用它 type() 直接查看某一类的类型?查看以下程序:
classRole: pass r=Role() #查看变量r的类型 print(type(r))#<class'__main__.Role'> #查看Role类型本身的类型 print(type(Role))#<class'type'>
在操作上述程序时,可以看到以下输出结果:
<class'__main__.Role'> <class'type'>
从以上输出结果可以看出,Role 类本身的类型是 type。这句话有点尴尬,怎么理解? Role 类的类型是 type?
从 Python 从解释器的角度来看,当程序使用时 class 定义 Role 类时也可以理解为定义一个特殊对象(type 类对象),并将对象赋值 Role 变量。因此,程序使用 class 所有类别的定义都是 type 类的实例。
实际上 Python 完全允许使用 type() 函数(相当于 type 创建构造器函数) type 对象,又因为 type 类的例子是类,所以 Python 可以使用 type() 动态创建函数类。例如下列程序:
deffn(self):
print('fn函数')
#使用type()定义Dog类
Dog=type('Dog',(object,),dict(walk=fn,age=6))
#创建Dog对象
d=Dog()
#分别查看d、类型的Dog
print(type(d))
print(type(Dog))
d.walk()
print(Dog.age)上面第 4 行代码使用 type() 定义了一个 Dog 类。在使用 type() 定义类时可指定三个参数:
参数1:创建的类名。
参数二:这类继承的父类集合。因为 Python 支持多继承,所以这里用元组指定它的多个父类。即使实际上只有一个父类,也需要使用元组语法(必须多一个逗号)。
参数3:该字典的对象是该类绑定的类变量和方法。其中字典 key 是类变量或方法名,如果字典 value 如果是普通值,则代表类变量;如果字典 value 是函数,代表方法。
由此可见,第 4 定义了一个行代码 Dog 类,这类继承了 object 类别,也为这类定义了一个 walk() 方法和一个 age 类变量。
操作上述程序,将看到以下输出结果:
<class'__main__.Dog'> <class'type'> fn函数 6
从上述输出结果可以看出,使用 type() 直接使用函数定义的类别 class 定义的类井没有区别。事实上,Python 解释器在执行中使用 class 事实上,当定义类时,它仍然被使用 type() 函数创建类。因此,无论如何定义类,程序最终都会创建一个 type 的实例。
