Python高级知识点学习(一)
Python中一切皆对象
和Java相比,Python的面向对象更加彻底。
函数和类也是对象,是python的一等公民。
代码和模块也可以称之为对象。
python中的类也是对象,类可以理解为模板,根据这个模板去生成我们的对象,可以动态修改类的属性。
何为一等公民?
- 可以赋值给一个变量
- 可以添加到集合对象中
- 可以作为参数传递给函数
- 可以当做函数的返回值 (生成器应用)
type、object、class之间的关系
类是由type来生成的一个对象,object是所有类都要继承的最顶层的一个基础类,type也是一个类,同时也是一个对象。
看代码片段一:
a = 1 b = "abc" print(type(1)) print(type(int)) print(type(b)) print(type(str))
打印出的结果: <class 'int'> <class 'type'> <class 'str'> <class 'type'>
代码片段二:
class Student: pass class MyStudent(Student): pass stu = Student() print(type(stu)) print(type(Student)) print(int.__bases__) print(str.__bases__) print(Student.__bases__)# 打印Student基类 print(MyStudent.__bases__)# 打印Student基类 print(type.__bases__) print(object.__bases__) # 最顶层的类的基类为空 print(type(object))
打印出的结果: <class '__main__.Student'> <class 'type'> (<class 'object'>,) (<class 'object'>,) (<class 'object'>,) (<class '__main__.Student'>,) (<class 'object'>,) () <class 'type'>
可以看到,类是由type来生成的一个对象。
上述代码建议反复阅读练习。
Python中常见的内置类型
首先说明对象的三个特征:
- 身份:也就是地址,通过id()函数查看地址
- 类型:int、str等
- 值:每个对象都有自己的值
常见内置类型:
- None(全局只有一个),Python解释器在启动时会用None生成一个None对象。
a = None b = None print(id(a) == id(b)) 打印结果: Ture
可以看到a,b是指向同一个对象(id相同)。
- 数值类型:int float complex(复数) bool。
- 迭代类型:可用for进行遍历
- 序列类型:list、bytes、range、tuple、str、array 等
- 映射类型:dict
- 集合类型:set、frozenset
- 上下文管理器:with语句
- 其他:class、实例 等等等。
Python中的魔法函数
问:什么是魔法函数?
答:双下划线开头,双下划线结尾的这些函数,通常称之为魔法函数。
例如:
一般魔法函数不要自定义,使用 Python 提供的即可。
使用 Python 提供的魔法函数,为了增强类的特性。
代码:使用魔法函数之前
class Company(object): def __init__(self, employee_list): self.employee = employee_list company = Company(["tom", "bob", "jane"]) for i in company.employee: print(i) 打印结果: a b c
代码:使用魔法函数之后
class Company(object): def __init__(self, employee_list): self.employee = employee_list def __getitem__(self, item): return self.employee[item] company = Company(["a", "b", "c"]) 打印结果: a b c
可以看到__getitem__()
这个魔法函数的功能。
定义了这个魔法函数后,实例化后的对象就隐含的变为可迭代对象(iterable)。
for循环其实是要拿到一个对象的迭代器,迭代器是需要实现__iter__
这个方法才会有迭代器特性,Python语法会做一些优化,如果拿不到迭代器,就会尝试去对象中找__getitem__
这个方法,如果有的话就会调用这个方法,一次一次直到将数据取完。这是python语言本身解释器会完成的功能。
魔法函数调用不需要显示调用,解释器会隐式调用。
Python的数据模型
魔法函数是Python数据模型的一个概念而已,因为网络上大家喜欢称之为魔法函数。
Python数据模型会增强对象的特性。
class Company(object): def __init__(self, employee_list): self.employee = employee_list def __getitem__(self, item): return self.employee[item] def __len__(self): return len(self.employee) company = Company(["a", "b", "c"]) print(len(company)) 结果: 3
__len__
魔法函数增强了company对象的特性。
因为魔法函数很多,类似的魔法函数请大家自行去网上查找,并查看用法。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 执行动态脚本
JSR 223中规范了在Java虚拟机上运行的脚本语言与Java程序之间的交互方式。JSR 233是JavaSE6的一部分,在Java表中API中的包是javax.script。 下面根据实践来说一下调用动态语言脚本具体做什么: 假如有这种情况:需要判断一个变量a的大小,但是判断规则是不确定的,可能是 a < 1,也可能是 a > 1、a == 1 等等。 下面是不调用动态脚本实现: public boolean compare(double a, String expression) { int n = Integer.parseInt(expression.replaceAll("\\D", "")); if(expression.contains(">=")) { return a >= n; } else if(expression.contains("<=")) { return a < n; } else if(expression.contains("==")) { return a == n; } else if(expression...
- 下一篇
python与c/c++相比有哪些优势?
理论上,python的确比C/C++慢(我对Java的开发没有经验,无法评论)。这一点不用质疑。C/C++是编绎语言,直接使用的是机器指令,而python总是跑在的虚拟机上, 把一个逻辑直接转换为机器指令,和把同样的逻辑转换为字节码,然后再转换为机器码来执行相比, 总是要高上一大截,这一点,有各种各样的性能报告,我没有必要,也没有必要去做出这样一个报告来, 我记得大概的数值是一到两个数量级,用C++的话来说,这就是所谓的抽象惩罚。 但实践上,并非这么简单。 现实开发者领域,总是新手远多于高手,而从新手转为高手的时间相比,C/C++使用者花费的时间要比Python使用者多的多,保守的估计是5~10倍。 这有两方面原因,一方面, C/C++(尤其是C++)的确是“博大精深”,而且总是有无穷无尽的细节,如果你是一个真正的开发者,你就会明白,实际上,就完全精通C/C++编绎器的选项,就足够学两门python了(一点都不夸张,我遇到很多做两三年的C++开发者,遇到一个编译或者链接问题都一筹莫展),而编绎器仅仅是C++开发过程中的最后一环而已,你可以不懂,但你总得要花时间去弄懂,因为,作为一个开发...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主