首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python编程思想(29):使用type()函数定义类

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

作者头像
蒙娜丽宁
发布2020-07-02 16:21:39
4030
发布2020-07-02 16:21:39
举报
文章被收录于专栏:极客起源极客起源

----------支持作者请转发本文-----------

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

-----------正文-----------

在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的实例。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客起源 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档