导语:本文章记录了本人在学习Python基础之元编程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。
属性:在Python中,数据的属性和处理数据的方法统称属性。
元编程:用元类进行编程,元类→类→对象,元类比类更抽象,生成类的类。
1、使用动态属性访问JSON类数据
第一版:利用json.load(fp)审查数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
第二版:使用动态属性访问JSON类数据
第一版查阅深层数据的格式比较冗长,例如feed'Schedule'40,我们希望在读取属性上采用feed.Schedule.events[40].name这类方式来改进。并且第二版的类能递归,自动处理嵌套的映射和列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
分析: FronenJSON类的关键是__getattr__方法。仅当无法使用常规的方式获取属性(即在实例、类或超类中找不到指定的属性),解释器才会调用特殊的__getattr__方法。
2、处理无效属性名
在Python中,由于关键字被保留,名称为关键字的属性是无效的。因此需要对第二版中的__init__进行改进:
1 2 3 4 5 6 |
|
3、使用特殊方法__new__
第三版:使用__new__构造方法把一个类转换成一个灵活的对象工厂函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1、类属性、实例属性、私有属性与特性
类属性:类属性在__init__()外初始化,属于类所有,所有实例共享一个属性。
调用方法:类属性在内部用classname.类属性名调用,外部既可以用classname.类属性名又可以用instancename.类属性名来调用。
实例属性:实例属性属于各个实例所有,互不干扰。
私有属性:
特性:是用于管理实例属性的类属性。
特性用途:经常用于把公开的属性变成使用读值方法和设值方法管理的属性,且在不影响客户端代码的前提下实施业务规则。
注意:
这是因为obj.attr不会从实例obj开始寻找attr,而是从obj.__class__开始;而且仅当类中没有名为attr的特性时,Python才会在实例中寻找attr。
简言之,就遮盖层级而言,类特性>实例属性>类属性。
2、使用特性验证属性
使用特性可以验证实例属性的有效性,同时能够根据已知属性和属性之间的关系式调整其他属性,避免硬编码。
案例:假设某商店经营坚果、杂粮等多种有机食物,每位顾客的订单会包含店中的一系列商品,我们需要根据客户的订单计算出总价。
分析:我们不希望顾客订单的商品重量为非正数,需要借助@property装饰器实现值的获取与设置,从而验证实例属性的有效性。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Tips:当我们需要设置只读属性时,只使用@property,无需使用@func.setter。
原理解析:为了更好地理解@property装饰器的原理,我们写一版效果相同但没使用装饰器的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
property 构造方法的完整签名:
1 |
|
3、特性工厂函数
抽象定义特性的方式有两种,一是使用特性工厂函数,二是使用描述符类。
下面我们用特性工厂函数来完成上文中提到的订单结算案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
4、使用特性删除属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
删除属性只需在主程序中发出指令:del obj.attr
1、特殊属性
2、内置函数
3、特殊方法
以上就是本文的全部内容,希望对大家的学习有所帮助
最后,小编想说一句话:我是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以加群:877562786
现在使用苹果手机的人也多了,而使用手机时,我们会在手机上存储各种数据,以及学会使用iPhone上的各种技巧。那现在就来和大家讲讲,如何使用iPhone手机的各种技巧。先来了解下iPhone手机的数据备份与恢复吧,毕竟数据在手机上的重要性是不言而喻的。一、iPhone数据备份与恢复(一)iPhone数据备份1、iCloud备份(1)在iPhone手机上,点击“设置”,进入到界面后,勾选需要备份的数据...
深度学习-85:智慧地球/智慧城市/智慧家庭CSDN专栏: 机器学习+深度学习(理论/实践)网络互联互通在企业级别渗透范围极其广泛,边缘领域(家庭、公共基础设施、安防等)并未网络互联互通,数据都停留在信息孤岛上。智慧地球从很高的维度关注工业化、信息化和全球化的趋势,智慧地球的理念的发布,立即在IT界、经济界、工业界等领域引起了巨大的反响。2009年金融危机,IBM首席执行官彭明盛(...
尝试在树莓派安装的raspbian系统上进行linux字符设备驱动1.更新安装kernel header源码sudo apt-get updatesudo apt-get install raspberrypi-kernel-headers可以使用uname -r查看当前版本2.编写模块源码mydev1.c#include<linux/module.h>#include...
内容简介首先说明本文要实现的内容:1.比较bboss-elasticsearch和springboot自带的spring-boot-starter-data-elasticsearch优缺点2.如果实现数据库数据全量、增量的导入到elasticsearch服务器中3.将excel、word、ppt、pdf等文件解析到elasticsearch服务器中4.通过json文件生生成mappin...
论文:《Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation》论文链接:https://arxiv.org/abs/1801.04381前文链接:MobileNet-v1详解– 概述 MobileNet-v2的主要思想就是在v1的基础上引入了线性瓶颈 (Linea
http://www.oracle.com/technetwork/cn/articles/database-performance/oracle-rac-connection-mgmt-1650424-zhs.html...
21秋季PAT甲级满分总结1.考前准备2.考试经历(附代码)2.1第一题2.2第二题2.3第三题2.4第四题3.总结和感想1.考前准备我的考试准备经历可能比较特别,今年3月份花了1个月在MOOC看了翁老师的C语言课以及浙大的数据结构与算法分析课程,之前的基础就是大一学过C语言课,如今已经毕业一年了,浙大的数据结构网课是纯用C实现的,所以做起题来比较繁琐,像队列堆栈这种简单的线性结构也要自己实现,不过好处也是很明显的,手动实现多了就会对数据结构有更深的了解,也算是打下了比较好的基础吧。网课看到哈希映射那
(1)错误描述:这个错误大概是说需要的参数是一个,而你传入了两个参数,导致了参数变多抛异常2019-03-28 09:05:09.375 ERROR 287527 --- [nio-1601-exec-2] o.s.b.w.servlet.support.ErrorPageFilter : Forwarding to error page from request [/isvSearch/g...
集合对像定义集合对象以学生类(StudentInfo)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项。使用stream().sorted()进行排序,需要该类实现Comparable接口,该接口只有一个方法需要实现,如下:public int compareTo(T o);有关compareTo方法的实现说明,请参考:Java 关于重写compareTo方法我的学生类代码如下:import java.time.LocalDate;import java.u...
从代码的角度来分析arm-linux启动阶段过程,以及相应的内存使用和页表结构。
《精通Unix下C语言编程与项目实践》读书笔记(new)文章试读不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国。一、二、三、四职场规划:一些杂七杂八的职场感悟吧。不值钱的软件人才精力充沛与事业成功让系分来得更猛烈些吧不值钱的系统分析师经济危机下大学生如何就业经济危机中如何提高...
定义枚举变量类型,设置枚举变量值,将枚举变量作为函数返回值输出。