Python编程思想(29):使用type()函数定义类

李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。

《Python编程思想》总目录
《Python编程思想》专栏

在Python语言中使用 type函数可以查看变量的数据类型,但如果想使用 type直接查看某个类的类型型呢?先看如下程序:

示例代码:type_demo. py

class MyClass:
    pass
my = MyClass()
# 查看变量my的类型
print(type(my)) # <class '__main__.MyClass'>
# 查看MyClass类本身的类型
print(type(MyClass)) # <class 'type'>

运行这段代码,会在Console中输出如下内容:

<class '__main__.MyClass'>
<class 'type'>

从上面的输出结果可以看到,MyClass类本身的类型是type。那么怎样理解MyClass类的类型是type呢?

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

实际上 Python完全允许使用 type函数(相当于type类的构造器函数)来创建type对象,又由于type类的实例就是类,因此,Python可以使用 type函数来动态创建类,代码如下:

示例代码: type_ class. py

def run(self):
    print('run函数')
# 使用type()定义Person类
Person = type('Person', (object,), dict(run=run, age=12))
# 创建Person对象
p = Person()
# 分别查看p和Person的类型
print(type(p))
print(type(Person))
p.run()
print(Person.age)

在这段代码中使用type函数定义了一个Person类。在使用type()函数定义类时可指定如下3个参数:

参数1:创建的类名;

参数2:该类继承的父类集合。由于 Python支持多继承,因此该参数使用元组指定它的多个父类。即使实际只有一个父类,也需要使用元组指定父类(必须要多一个逗号,否则会抛出下面的异常);

TypeError: type.__new__() argument 2 must be tuple, not type

参数3:该参数是一个字典类型的值,表示该类绑定的类变量和方法。其中字典的key就是类变量或方法,如果字典的 value是普通值,那就代表类变量;如果字典的 value是函数,则代表方法;

由此可见,这段代码中定义的Person类的父类是object类,还为该类定义了一个run()方法和一个age类变量。运行这段代码,会输出如下的结果:

<class '__main__.Person'>
<class 'type'>
run函数
12

从上面的输出结果可以看出,使用 type()函数定义的类与直接使用 class定义的类并没有任何区别。事实上, Python解释器在执行使用 class定义的类时,其实依然是使用 type函数来创建类的。因此,无论通过哪种方式定义类,程序最终都是创建一个type的实例。

-----------------支持作者请转发本文,也可以加李宁老师微信:unitymarvel,或扫描下面二维码加微信--------
在这里插入图片描述

欢迎关注 极客起源 微信公众号,更多精彩视频和文章等着你哦!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/nokiaguy/article/details/107012454
今日推荐