Python中一切皆对象

本章节首先对比静态语言以及动态语言,然后介绍 python 中最底层也是面向对象最重要的几个概念-object、type和class之间的关系,以此来引出在python如何做到一切皆对象、随后列举python中的常见对象。

1.Python中一切皆对象

Python的面向对象更彻底,Java和C++中基础类型并不是对象。在Python中,函数和类也是对象,属于Python的一等公民。对象具有如下4个特征

  • 1.赋值给一个变量
  • 2.可以添加到集合对象中
  • 3.可以作为参数传递给函数
  • 4.可以作为函数地返回值

下面从四个特征角度分别举例说明函数和类也是对象

1.1 类和函数都可以赋值给一个变量

类可以赋值给一个变量

class Person:
def __init__(self, name="lsg"):
print(name) if __name__ == '__main__':
my_class = Person # 类赋值给一个变量
my_class() # 输出lsg,变量直接调用就可以实例化一个类,满足上面的特征1,这里显然说明类也是一个对象
my_class("haha") # 输出haha

函数可以赋值给一个变量

def func_test(name='lsg'):
print(name) if __name__ == '__main__':
my_func = func_test
my_func("haha") # 输出haha,对变量的操作就是对函数的操作,等效于对象的赋值,满足上面的特征1,说明函数是对象。

1.2 类和函数都可以添加到集合中

class Person:
def __init__(self, name="lsg"):
print(name) def func_test(name='lsg'):
print(name) if __name__ == '__main__':
obj_list = [func_test, Person]
print(obj_list) # 输出[<function func_test at 0x0000025856A2C1E0>, <class '__main__.Person'>]

1.3 类和函数都可以作为参数传递给函数

class Person:
def __init__(self, name="lsg"):
print(name) def func_test(name='lsg'):
print(name) def print_type(obj):
print(type(obj)) if __name__ == '__main__':
print_type(func_test)
print_type(Person)

输出如下

<class 'function'>
<class 'type'>

可以明显地看出类和函数都是对象

1.4 类和函数都可以作为函数地返回值

class Person:
def __init__(self, name="lsg"):
print(name) def func_test(name='lsg'):
print(name) def decorator_func():
print("pre function")
return func_test def decorator_class():
print("pre class")
return Person if __name__ == '__main__':
decorator_func()() # 返回的右值作为函数可以直接调用
decorator_class()() # 返回的右值作为类可以直接实例化

2.type、object和class的关系

代码举例如下, 可以得出三者的关系是type --> class --> obj

2.1 type --> int --> a

a = 1
print(type(a)) # <class 'int'>
print(type(int)) # <class 'type'>

2.2 type --> str --> b

b = 'abc'
print(type(b)) # <class 'str'>
print(type(str)) # <class 'type'>

2.3 type --> Student --> stu

class Student:
pass stu = Student()
print(type(stu)) # <class '__main__.Student'>
print(type(Student)) # <class 'type'>

2.4 type --> list --> c

c = [1, 2]
print(type(c)) # <class 'list'>
print(type(list)) # <class 'type'>

总结图:

3.Python中常见的内置类型

对象的三个特征:身份、内存和值

  • 身份:在内存中的地址,可以用id(变量)函数来查看
  • 类型:任何变量都必须有类型

常见的内置类型如下

3.1 None:全局只有一个

如下代码,两个值为None的变量地址完全相同,可见None是全局唯一的

a = None
b = None
print(id(a))
print(id(b))
print(id(a) == id(b))

3.2 数值类型

  • int
  • float
  • complex(复数)
  • bool

3.3 迭代类型:iterator

3.4 序列类型

  • list
  • bytes、bytearray、memoryview(二进制序列)
  • range
  • tuple
  • str
  • array

3.5 映射类型(dict)

3.6 集合

  • set
  • frozenset

3.7 上下文管理类型(with)

3.8 其他

  • 模块类型
  • class和实例
  • 函数类型
  • 方法类型
  • 代码类型
  • object类型
  • type类型
  • elipsis类型
  • notimplemented类型

欢迎关注我的公众号查看更多文章

【Python核心编程笔记】一、Python中一切皆对象的更多相关文章

  1. python核心编程--笔记

    python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找pyt ...

  2. python核心编程--笔记(不定时跟新)(转)

    的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   ...

  3. python核心编程笔记(转)

    解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗 ...

  4. Python核心编程笔记--动态属性

    一.动态语言与静态语言 1.1 静态语言特点: a. 在定义变量时需要指定变量的类型,根据指定的类型来确定变量所占的内存空间 b. 需要经过编译才能运行 c. 在代码编译后,运行过程不能对代码进行操作 ...

  5. Python核心编程笔记 第三章

    3.1     语句和语法    3.1.1   注释( # )   3.1.2   继续( \ )         一般使用换行分隔,也就是说一行一个语句.一行过长的语句可以使用反斜杠( \ ) 分 ...

  6. Python核心编程笔记 第二章

    2.1   程序输出:print语句         可以使用print语句显示变量的字符串表示,或者仅用变量名查看该变量的原始值. 2.2   程序输出和raw_input()内建函数       ...

  7. python核心编程笔记——Chapter7

    Chapter7.映像和集合类型 最近临到期末,真的被各种复习,各种大作业缠住,想想已经荒废了python的学习1个月了.现在失去了昔日对python的触觉和要写简洁优雅代码的感觉,所以临到期末毅然继 ...

  8. Python核心编程笔记(类)

    Python并不强求你以面向对象的方式编程(与Java不同) # coding=utf8 class FooClass(object): version = 0.1 def __init__(self ...

  9. Python核心编程笔记----注释

    python 中注释有两种 第一种,文档注释 第二种,一般的注释 下面是例子: class MyClass: '这个是文档注释' def __repr__(self): return "re ...

随机推荐

  1. nodejs如何下载指定版本

    浏览了一下nodejs的官网,但是官网没有下载低版本的下载地址,所以找了一个可以下载指定版本node的下载地址https://nodejs.org/download/release/v8.9.4/

  2. Java 操作Oracle数据库

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  3. 昨晚12点,女朋友突然问我:你会RabbitMQ吗?我竟然愣住了。

    01为什么要用消息队列? 1.1 同步调用和异步调用 在说起消息队列之前,必须要先说一下同步调用和异步调用. 同步调用:A服务去调用B服务,需要一直等着B服务,直到B服务执行完毕并把执行结果返回给A之 ...

  4. 如何使用命令将文件夹中的文件名(包括路径)写入到txt文件中

    在cmd中使用 cd /d 路径,进入当前文件夹中 使用 dir /s /b > 0.txt 如图:

  5. Codeforces Round #672 (Div. 2) D. Rescue Nibel!(排序)

    题目链接:https://codeforces.com/contest/1420/problem/D 前言 之前写过这场比赛的题解,不过感觉这一题还可以再单独拿出来好好捋一下思路. 题意 给出 $n$ ...

  6. 【uva 10954】Add All(算法效率--Huffman编码+优先队列)

    题意:有N个数,每次选2个数合并为1个数,操作的开销就是这个新的数.直到只剩下1个数,问最小总开销. 解法:合并的操作可以转化为二叉树上的操作[建模],每次选两棵根树合并成一棵新树,新树的根权值等于两 ...

  7. 【noi 2.7_7219】复杂的整数划分问题(算法效率)

    题意:若干组数据,分别问 N划分成K个正整数之和的划分数目.N划分成若干个不同正整数之和的划分数目.N划分成若干个奇正整数之和的划分数目. 解法:请见我之前的一篇博文内的Article 2--[noi ...

  8. 【noi 2.6_9272】偶数个数字3(DP)

    题意:问所有的N位数中,有多少个有偶数个数字3的数. 解法:f[i][j]表示i位数中含数字3的个数模2为j的个数.于是分第i位填3还是不填3讨论. 小tip:要模12345:for循环新定义了一个变 ...

  9. C. Table Decorations

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  10. hdu 1045 Fire Net 二分图匹配 && HDU-1281-棋盘游戏

    题意:任意两个个'车'不能出现在同一行或同一列,当然如果他们中间有墙的话那就没有什么事,问最多能放多少个'车' 代码+注释: 1 //二分图最大匹配问题 2 //难点在建图方面,如果这个图里面一道墙也 ...