【Python核心编程笔记】一、Python中一切皆对象
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中一切皆对象的更多相关文章
- python核心编程--笔记
python核心编程--笔记 的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找pyt ...
- python核心编程--笔记(不定时跟新)(转)
的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找python路径 1.4 –v ...
- python核心编程笔记(转)
解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找python路径 1.4 –v 冗 ...
- Python核心编程笔记--动态属性
一.动态语言与静态语言 1.1 静态语言特点: a. 在定义变量时需要指定变量的类型,根据指定的类型来确定变量所占的内存空间 b. 需要经过编译才能运行 c. 在代码编译后,运行过程不能对代码进行操作 ...
- Python核心编程笔记 第三章
3.1 语句和语法 3.1.1 注释( # ) 3.1.2 继续( \ ) 一般使用换行分隔,也就是说一行一个语句.一行过长的语句可以使用反斜杠( \ ) 分 ...
- Python核心编程笔记 第二章
2.1 程序输出:print语句 可以使用print语句显示变量的字符串表示,或者仅用变量名查看该变量的原始值. 2.2 程序输出和raw_input()内建函数 ...
- python核心编程笔记——Chapter7
Chapter7.映像和集合类型 最近临到期末,真的被各种复习,各种大作业缠住,想想已经荒废了python的学习1个月了.现在失去了昔日对python的触觉和要写简洁优雅代码的感觉,所以临到期末毅然继 ...
- Python核心编程笔记(类)
Python并不强求你以面向对象的方式编程(与Java不同) # coding=utf8 class FooClass(object): version = 0.1 def __init__(self ...
- Python核心编程笔记----注释
python 中注释有两种 第一种,文档注释 第二种,一般的注释 下面是例子: class MyClass: '这个是文档注释' def __repr__(self): return "re ...
随机推荐
- docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像
docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像 一.docker通过dockerfile构建JDK最小镜像 1.1 下载JRE 1.2 解压JRE,删除相关不需要文件 ...
- login shell 和 non-login shell 的相关问题
问题:通过su命令切换用户并没有进入该用户的shell环境.这是为什么? 要解决这个问题,我们必须清楚用login shell 和non-login shell的区别. login sh ...
- 学习一下 SpringCloud (四)-- 服务降级、熔断 Hystrix、Sentinel
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
- Flink-v1.12官方网站翻译-P021-State & Fault Tolerance-overview
状态和容错 在本节中,您将了解Flink为编写有状态程序提供的API.请看一下Stateful Stream Processing来了解有状态流处理背后的概念. 下一步去哪里? Working wit ...
- Cloudera Manager安装部署
1.连接阿里云服务器 打开远程连接工具进行配置,这里以CRT为例. 1)新建一个session 2)填写hostname(填写公网ip) 2.修改hosts [root@hadoop001 ~]# v ...
- Codeforces Round #635 (Div. 1)
传送门 A. Linova and Kingdom 题意: 给定一颗以\(1\)为根的树,现在要选定\(k\)个结点为黑点,一个黑点的贡献为从他出发到根节点经过的白点数量. 问黑点贡献总和最大为多少. ...
- P1439 【模板】最长公共子序列(DP)
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- UVA 10480 Sabotage (最大流) 最小割边
题目 题意: 编写一个程序,给定一个网络规范和破坏每个连接的成本,确定要切断哪个连接,以便将首都和最大的城市分离到尽可能低的成本. 分割-------------------------------- ...
- C# 网络流
流(stream)是对串行传输的数据的一种抽象表示,底层的设备可以是文件.外部设备.主存.网络套接字等等. 流有三种基本的操作:写入.读取和查找. 如果数据从内存缓冲区传输到外部源,这样的流叫作&qu ...
- c#中几种常见的数据结构
数组(Array): 1.数组存储在连续的内存上 2.数组的元素类型必须相同 3.数组可以直接通过下标访问 4.查找与修改元素的速度非常快 5.必须在声明时指定长度 动态数组(ArrayLis ...