Python中type()详解:动态创建类

众所周知:
type()函数可以查看变量的类型:
先看一个简单的列子来看一下type查看变量类型

class Animal():
    pass

a=Animal()
print(type(a))
print(type(Animal))
    
<class '__main__.Animal'>
<class 'type'>

可以发现我定义的Animal类本身的类型是 type

从 Python 解释器的角度来看,当程序使用 class 定义 Animal 类时,也可理解为定义了一个特殊的对象(type 类的对象),并将该对象赋值给 Animal 变量。因此,程序使用 class 定义的所有类都是 type 类的实例。

实际上 Python 完全允许使用 type() 函数(相当于 type 类的构造器函数)来创建 type 对象,又由于 type 类的实例就是类,因此 Python 可以使用 type() 函数来动态创建类
正常情况下类的创建及实例化调用

class Test():
    name = "Test"
    def hello(self):
        print("hello world")

t = Test()
t.hello()#Test.hello(t)
print(t.name)

而使用type()动态创建类:

def hello(self):
    self.name = 10
    print("hello world")

t = type("hello",(),{"a":1,"hello":hello})
print(t)
T = t()
print(T.a)
T.hello()
print(T.name)

<class '__main__.hello'>
1
hello world
10

所以type是可以实现动态创建类的,其实python中一切都是对象,类也是对象;只不过是一种特殊的对象,是type的对象

python中类创建的本质:
我们使用class创建类,当你使用class关键字时,Python解释器自动创建这个对象。而底层其实使用的是type函数(type函数也可以查看实例所属类型)来创建类的。所以我们可以直接使用type()函数来手动实现动态创建类。

当type()只有一个参数时,其作用就是返回变量或对象的类型
当type()有三个参数时,其作用就是创建类对象:
  第一个参数:name表示类名称,字符串类型
  第二个参数:bases表示继承对象(父类),元组类型,单元素使用逗号
  第三个参数:attr表示属性,这里可以填写类属性、类方式、静态方法,采用字典格式,key为属性名,value为属性值

总结:

通过type添加的属性是类属性,并不是实例属性

通过type可以给类添加普通方法,静态方法,类方法,效果跟class一样

type创建类的效果,包括继承等的使用性质和class创建的类一样。本质class创建类的本质就是用type创建。所以可以说python中所有类都是type创建的。

对元类的理解与注意事项

元类就是类的类,python中函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类。Python中所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。type就是Python的内建元类,当然了,也可以创建自己的元类

python查看对象所属类型既可以用type函数,也可以用对象自带的__class__属性。
以下代码验证:任何对象最终的所属类都是type。 type是所有类的创造者。

num = 1
print(num.__class__)
print(num.__class__.__class__)

<class 'int'>
<class 'type'>
posted @ 2019-06-18 19:38  Python及时行乐  阅读(5565)  评论(1编辑  收藏  举报