前言
犹记得当初学习 Python 的时候, 对于 Python 一切皆对象很是懵逼, 因为 Python 是面向对象的动态型语言, 而在函数及高阶函数的应用中, 如若对于一切皆对象不是有很透彻的了解, 基础不是那么牢固的话, 那么对于今后的 Python 进阶而言, 就有点拖后腿了, 鉴于有朋友跟我联系说, 对于一切皆对象掌握的不是太牢固, 那么, 木子的本篇博客就对此知识点进行概括总结.
如有不当之处, 还望各位大佬指正.
简述
长话短说, 本文主要针对 Python 一切皆对象来讨论, 主要从以下两个方面来论述:
Python 的一等公民
type,object 和 class 的关系
对于 Python 的常见内置类型, 本篇就不做详细阐述
内置类型:
None(全局只有一个)
数值类型: int,float,complax(复数),bool
迭代类型
序列类型: list,bytes,range,tuple,str,array
映射类型: dict
集合类型: set,frozenset
上下文管理类型: with
Python 的一等公民
何为一等公民?
可以赋值给一个变量
可以添加到集合对象中
可以作为参数传递给函数
可以当做函数的返回值
针对赋值给变量及添加到集合对象中, 代码予以展示:
- def func(name='Python'):
- print(f'the func is {name}')
- class Test:
- def __init__(self):
- print(f'the class is {Test.__name__}')
- obj_list = []
- obj_list.append(func)
- obj_list.append(Test)
- for item in obj_list: # 添加至集合对象中
- print(item())
那么上述例子, 代码运行结果如下:
- the func is Python # 函数 func 运行, 打印结果
- None # 函数 func 因没有 return, 返回 None
- the class is Test # 类 Test 运行, 打印结果
- <__main__.Test object at 0x0000024AB34526A0> # 类 Test 运行, 因没有返回值, 调用 item(), 返回类 Test 的对象
那么对于可以作为参数传递, 以下代码展示:
- def func(name='Python'):
- print(f'the func is {name}')
- def decorator_func():
- print(f'the decorator_func is running')
- return func # 返回函数 func
- my_test = decorator_func()
- my_test('木子的三维世界') # 传递参数, 调用 func
上述代码运行结果如下:
the decorator_func is running
the func is 木子的三维世界
type,object 和 class 的关系
上面的代码是演示何为 Python 的一等公民, 那么对于为什么 Python 一切皆对象, 想必有些道友还是有点不太懂, 那么重点来了, 了解完 type,object 和 class 后, 木子觉得大家应该就可以彻底 hold 住了.
为便于理解, 代码予以展示:
- # 示例如下
- a=2019
- b="一切皆对象"
- print(type(2019))
- print(type(int))
- print(type(b))
- print(type(str))
- class Student:
- pass
- stu = Student()
- print(type(stu))
- print(type(Student))
- print(int.__bases__)
- print(str.__bases__)
- print(Student.__bases__)
- print(type.__bases__)
- print(object.__bases__)
- print(type(object))
- print(type(type))
上面代码, 运行结果如下:
- <class 'int'>
- # 2019 是由 int 这个类创建的实例
- <class 'type'>
- # int 这个类是由 type 这个类创建的实例
- <class 'str'>
- # 同上
- <class 'type'>
- <class '__main__.Student'>
- # stu 是类 Student 创建的实例
- <class 'type'>
- # 类 Student 是由 type 这个类创建的实例 (
- <class 'object'>
- ,) # 类 int 的基类是 object 这个类 (
- <class 'object'>
- ,) # 同上 (
- <class 'object'>
- ,) # 同上 (
- <class 'object'>
- ,) # 重点: 类 type 的基类也是 object 这个基类 () # 重点: 类 object 没有基类
- <class 'type'>
- # 难点: 类 object 是由类 type 创建的实例
- <class 'type'>
- # 难点: 类 type 是由 type 类自身创建的实例
对于上面的代码, 我们可以得出以下结论:
类 type 产生 int 实例, 类 int 又有了 2019 这样的实例
类 object 是最顶层的基类
type 也是一个类, 同时也是一个对象
想必有些道友, 看到上面的代码, 已经有点懵逼了. 请看下图:
**type,boject,class 的关系示意图 **
对于上面图片的解读如下:
object 是一切对象: list,str,dict,tuple 的基类, 同时 object 是 type 的实例
类 type 是自身的实例, 同时 type 也继承自 object 类
由结论 1 和结论 2, 得出一切皆对象, 同时一切皆继承自 object 类
总结
Python 一切皆对象对于函数式编程, 以及 Python 各种高阶用法有很大帮助.
如果哪位道友还不是很清楚, 那么多看看上面的图片, 没事儿多看看, 多看看不坏事儿... 好了, 话又开始多了
那么想必各位道友看到这里, 已经对于 Python 一切皆对象有了比较清的认知, 后续木子会更新一篇关于 Python 元类的博客, 今天也算是做个铺垫.
备注: 为何 type 类可以自身的实例, 有兴趣的道友可以了解下指针的概念.
时候不早了, 睡觉睡觉, 明天周一上班...
来源: http://www.jianshu.com/p/9b3018750913