彻底搞懂Python一切皆对象!!!

系统 1671 0

一切皆对象

    • 前言
    • 简述
      • Python的一等公民
      • type、object和class的关系
    • 总结


前言

犹记得当初学习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))

            
          

上面代码,运行结果如下:

            
              
                									# 2019是由int这个类创建的实例

                
                  									# int这个类是由type这个类创建的实例

                  
                    									# 同上

                    
                      
                        						# stu是类Student创建的实例

                        
                          									# 类Student是由type这个类创建的实例
(
                          
                            ,)								# 类int的基类是object这个类
(
                            
                              ,)								# 同上
(
                              
                                ,)								# 同上
(
                                
                                  ,)								# 重点:类type的基类也是object这个基类
()												# 重点:类object没有基类

                                  
                                    									# 难点:类object是由类type创建的实例

                                    
                                      									# 难点:类type是由type类自身创建的实例

                                    
                                  
                                
                              
                            
                          
                        
                      
                    
                  
                
              
            
          

对于上面的代码,我们可以得出以下结论:

  1. 类type产生int实例,类int又有了2019这样的实例
  2. 类object是最顶层的基类
  3. type也是一个类,同时也是一个对象

想必有些道友,看到上面的代码,已经有点懵逼了。请看下图:
彻底搞懂Python一切皆对象!!!_第1张图片
对于上面图片的 解读如下

  1. object是一切对象:list、str、dict、tuple的基类,同时object是type的实例
  2. 类type是自身的实例,同时type也继承自object类
  3. 由结论1和结论2,得出一切皆对象,同时一切皆继承自object类

总结

Python一切皆对象对于函数式编程,以及Python各种高阶用法有很大帮助。
如果哪位道友还不是很清楚,那么 多看看上面的图片 ,没事儿多看看,多看看不坏事儿。。。好了,话又开始多了

那么想必各位道友看到这里,已经对于Python一切皆对象有了比较清的认知,后续木子会更新一篇 关于Python元类的博客 ,今天也算是做个铺垫。

备注:为何type类可以自身的实例,有兴趣的道友可以了解下指针的概念。

时候不早了,睡觉睡觉,明天周一上班。。。


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论