Python高级编程-Python一切皆对象
第一章:Python高级编程-Python一切皆对象
1. Python一切皆对象
1.1 函数和类也是对象,属于Python的一等公民
"""
特点:
1.可以赋值给一个变量
2.可以增加到集合对象中
3.可以作为参数传递给函数
4.可以当做函数的返回值
"""
def ask(name="coder"):
print(name)
class Person:
def __init__(self):
print("coder")
def print_type(item):
print(type(item))
def decorator_func():
print("dec start")
return ask # 作为函数的返回值,Python装饰器的部分实现原理
# 函数赋值给变量后执行
my_func = ask
my_func("王尼玛") # 输出”王尼玛“
# 类作为变量赋值给变量后实例化
my_class = Person
my_class() # 会执行__init__()方法,输出“coder”
# 类和函数增加到集合对象
obj_list = []
obj_list.append(ask)
obj_list.append(Person)
for item in obj_list:
print(item())
print_type(item) # 作为参数传入函数
1.2 type、object和class的关系
"""
原来type并没有那么简单。
"""
>>> a = 1
>>> type(1)
<class 'int'>
>>> type(int)
<class 'type'>
>>> b = "abc"
>>> type(b)
<class 'str'>
>>> type(str)
<class 'type'>
"""
wow, 得出来一个现象 type->int->1和type->str->"abc",
那么猜测我们自己定义的类是不是也是这样关系呢?
"""
>>> class Student():
... pass
...
>>> stu = Student()
>>> type(stu)
<class '__main__.Student'>
>>> type(Student)
<class 'type'>
"""
soga, 我们可以得出一个结论: type->class->obj,
也就是说,我们所定义的类是type类的一个实例化对象,
而我们的stu是我们自己定义类Student的一个实例化对象。
也就是说的<class 'type'>是用来生成类的。
看的课程的这里,我仿佛感受到了Python一切皆对象的魅力所在,
哈哈哈。
"""
# object是所有类默认的一个基类, 即object是最顶层基类。
>>> Student.__bases__
(<class 'object'>,)
>>> class MyStudent(Student):
... pass
...
>>> MyStudent.__bases__
(<class '__main__.Student'>,)
"""
问题来了:type也是一个类,同时type也是一个对象,那么type的基类是谁?
"""
>>> type.__bases__
(<class 'object'>,)
# 好玩的来喽,如果执行type(object)看看object类是谁生成的呢?
>>> type(object)
<class 'type'>
>>> type(type)
<class 'type'>
# 再来好玩的!来看看object类基类谁呢?
>>> object.__bases__
()
# 结论:type继承了object,而object又是type的实例。
# 老师画了关系图,如下。
这张图给我展现了<class 'type'>
是个厉害的家伙啊,他把一切都变成了对象,连自己都不放过。所以,有了<class 'type'>
你就不缺对象啦,哈哈哈哈。
<class 'object'>
是所有类的祖先哦,从图上看来,<class 'type'>
与<class 'object'>
有着不伦的关系啊!!!
好啦,课程老师告诉我们,其实上面一系列的不伦关系都是指针
这个东西干的,嘿嘿嘿........
总结:类都是type的实例 (object也是type的实例,type本身也是自己的实例),所有的类的顶层基类都是object (type的基类也是object)。Python一切皆对象的哲学就是玩起来的。
Python一切皆对象这么做就是为了一切都可以轻易的修改,使得Python非常灵活。C++/Java中的类一旦加载到内存后就不能修改(不绝对,修改很困难)。Python把类都搞成对象了,这样修改起来就很方便。
再次梳理:一切类都是由<class 'type'>
所生出来的,<class 'object'>
很特别,它虽是<class 'type'>
的爸爸但也是由<class 'type'>
生出来的。
咦?<class 'type'>
和<class 'object'>
那个先出来的?
怎么我越想越乱?
难道?<class 'type'>在把<class 'object'>生出来的同时,<class 'object'>
又做了<class 'type’>
的爸爸???WTF???
求评论区解释,遇到的问题就是:type需要继承object,但是object又是type的实例,这样的关系有矛盾啊?
1.3 Python中的常见内置类型
1.3.1 对象的三个特征
(1) 身份
>>> a = 1
"""
这里的1是值由<class 'int'>进行封装,最后变量a指向这个obj
"""
>>> id(a)
5656454878 # 不同机器不同结果
(2) 类型
(3) 值
1.3.2 None(全局只有一个)
"""
解释器启动时None对象被创建,且全局只有一个。
"""
>>> a = None
>>> b = None
>>> id(a) == id(b) # 通过对比两个变量所指向内存地址相同,可见None对象全局只有一个。
True
1.3.3 数值
(1) int
(2) float
(3) complex (复数)
(4) bool
1.3.4 迭代类型
1.3.5 序列类型
(1) list
(2) bytes、bytearray、memoryview (二进制序列)
(3) range
(4) tuple
(5) str
(6) array
1.3.6 映射(dict)
1.3.7 集合
(1) set
与dict
实现原理相似,性能高。
(2) frozenset
frozen
adj. 冻结的;冷酷的
v. 结冰;凝固;变得刻板
1.3.8 上下文管理类型(with)
1.3.9 其他
对于Python,一切皆对象啦。那么就会有一下类型。
(1) 模板类型
(2) class和实例
(3) 函数对象
(4) 方法类型
(5) 代码类型
(6) object类型
(7) type 类型
(8) ellipsis 类型
(9) notimplemented 类型
Python 的灵活性就使得它的严谨性有一定损失,但是其带给我们开发效率上的提升是显然的。
Python高级编程-Python一切皆对象的更多相关文章
- 第三章:Python高级编程-深入类和对象
第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...
- 第九章:Python高级编程-Python socket编程
第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...
- python高级编程:有用的设计模式3
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...
- python高级编程:有用的设计模式2
# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- python高级编程技巧
由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
- python高级编程之列表推导式
1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...
- Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍
原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...
随机推荐
- 非PDC角色DC强制NTP
前一阵,公司其他部门员工告诉我,他们的系统无法通过LDAP搜索账户了 经过检查,发现该服务器的时间居然比我们的时间服务器PDC快了将近20分钟,而且该问题机器的 时间源并非PDC,而是另外一台普通DC ...
- Centos7_搭建暗网网站
Tor运行原理 请求方需要使用:洋葱浏览器(Tor Browser)来对暗网网站进行访问 响应放需要使用:Tor协议的的Hidden_service 搭建步骤 更新YUM源: rpm -Uvh htt ...
- 基于 Njmon + InfluxDB + Grafana 实现性能指标实时可视监控
引言 最近逛 nmon 官网时,发现了一个新工具 njmon,功能与 nmon 类似,但输出为 JSON 格式,可以用于服务器性能统计. 可以使用 njmon 来向 InfluxDB 存储服务器性能统 ...
- 简单网络编程如何用python来实现
对于网络编程,通信模式是后台必备技能,先用最基础代码实现,理解一些 API 的含义,在深入学习. 总是有读者问过我关于 Python 后台开发相关,如果想走 Python 后台方向,对于 Python ...
- 后端code review finished 12-28
今天只有天赋和士杰有相应的后端代码的code review工作,因为并没有召开daily scrum.只是天赋和士杰对后端所有的代码进行了review,对代码进行了整理并删除了一些残留的0 refre ...
- C# 基础知识系列- 12 任务和多线程
0. 前言 照例一份前言,在介绍任务和多线程之前,先介绍一下异步和同步的概念.我们之间介绍的知识点都是在同步执行,所谓的同步就是一行代码一行代码的执行,就像是我们日常乘坐地铁通过安检通道一样,想象我们 ...
- 形象地展示信号与系统中的一些细节和原理——卷积、复数、傅里叶变换、拉普拉斯变换、零极图唯一确定因果LTI系统
看懂本文需要读者具备一定的微积分基础.至少开始学信号与系统了本文主要讲解欧拉公式.傅里叶变换的频率轴的负半轴的意义.傅里叶变换的缺陷.为什么因果LTI系统可以被零极图几乎唯一确定等等容易被初学者忽略但 ...
- python执行提示“ImportError: No module named OpenSSL.crypto”
错误信息如下: Traceback (most recent call last): File "/usr/local/yunanbao/yxz-script/autoops/TaskSer ...
- 在手机和电脑间双向加密传输文件 —— Windows 安装 Kde Connect
2020-04-27 作为 Kde 项目的一部分,Windows 用户可能很少知道它,但它确实存在,而且超棒. Kde Connect 简直了,现在我的手机和 Linux 主机以及 Win 本完全是一 ...
- curl请求本地域名问题
curl在本地虚拟机上请求本地接口时候,出现域名解析问题,换为ip即可,可用curl_error() 或者curl_errno来调试: vue单个文件在引入时候自己的逻辑js文件一定要放在html后引 ...