python都有哪些包装_Python基础:21包装

“包装”在Python 编程中经常会被提到的一个术语。意思是对一个已存在的对象进行包装,可以是对一个已存在的对象,增加,删除,或者修改功能。

可以包装任何类型(type)作为一个类(class)的核心成员,以使新对象的行为模仿你想要的数据类型中已存在的行为,并且去掉你不希望存在的行为。

授权是包装的一个特性,实现授权的关键点就是覆盖__getattr__()方法,在其中包含一个对getattr()内建函数的调用。

特殊方法__getattr__()的工作方式是,当搜索一个属性时,任何局部对象首先被找到(定制的对象)。如果搜索失败了,则__getattr__()会被调用。

换言之,当引用一个属性时,Python 解释器将试着在局部名称空间中查找那个名字,如果没有在局部字典中找到,则搜索类名称空间,最后,如果两类搜索都失败了,搜索则对原对象开始授权请求,此时,__getattr__()会被调用。

包装的一个简单例子:

classWrapMe(object):def __init__(self, obj):

self.__data =objdefget(self):return self.__data

def __repr__(self):return ‘self.__data‘def __str__(self):return str(self.__data)def __getattr__(self, attr):return getattr(self.__data, attr)

这里将用到复数,因为所有Python数值类型,只有复数拥有属性:

>>> wrapcomplex =WrapMe(3.5+4.2j)>>>wrapcomplex

(3.5+4.2j)>>>wrapcomplex.real3.5

>>>wrapcomplex.imag4.2

>>>wrapcomplex.conjugate()

(3.5-4.2j)>>>wrapcomplex.get()

(3.5+4.2j)

访问复数的三种属性,我们的自定义类中一种都没有定义,对这些属性的访问,是通过getattr()方法,授权给对象。调用get()方法没有授权,因为它是为我们的对象定义的。

下一个使用包装类的例子用到一个列表。我们将会创建对象,然后执行多种操作,每次授权给列表方法。

>>> wraplist =WrapMe([123, 'foo', 45.67])>>>wraplist.append('bar')>>>wraplist.append(123)>>>wraplist

[123, 'foo', 45.67, 'bar',123]>>>wraplist.index(45.67)2

>>>wraplist.count(123)2

>>>wraplist.pop()123

>>>wraplist

[123, 'foo', 45.67, 'bar']

注意,只有已存在的属性是在此代码中授权的。特殊行为没有在类型的方法列表中,不能被访问,因为它们不是属性。一个例子是,对列表的切片操作,它是内建于类型中的,而不是像append()方法那样作为属性存在的。也就是说,切片操作符是序列类型的一部分,并不是通过__getitem__()特殊方法来实现的。

>>> wraplist[2]

Traceback (most recent calllast):

File"", line 1, inTypeError:'WrapMe' objectdoes not support indexing

然而,还有一种"作弊"的方法,访问实际对象[通过get()方法]和它的切片能力.

>>> reallist =wraplist.get()>>> reallist[3]'bar'

这就是为什么需要实现get()方法了----仅仅是为了我们需要取得对原对象进行访问这种情况。

另外一个例子,描述了一个包装文件对象的类。我们的类与一般的文件对象行为完全一样, 除了在写模式中,字符串只有全部为大写时,才写入文件。下面提供一个文件类对象,定制write()方法,同时,给文件对象授权其它的功能:

classCapOpen(object):def __init__(self, fn,mode='r', buf=-1):

self.file=open(fn, mode, buf)def __str__(self):returnstr(self.file)def __repr__(self):return`self.file`defwrite(self, line):

self.file.write(line.upper())def __getattr__(self, attr):returngetattr(self.file, attr)>>> f = CapOpen('/tmp/xxx','w')>>>f.write('delegation example\n')>>>f.write('faye is good\n')>>>f.write('at delegating\n')>>>f.close()>>>f

可以看到,唯一不同的是第一次对CapOpen()的调用,而不是open()。除了write(),所有属性都已授权给文件对象:

>>> f =CapOpen('/tmp/xxx', 'r')>>> for eachLine inf:

...printeachLine,

...

DELEGATION EXAMPLE

FAYE IS GOOD

AT DELEGATING

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 运算符括号

转载于:https://www.cnblogs.com/fanweisheng/p/11236193.html

计算机二级java试题_计算机二级考试《Java》试题及答案

计算机二级考试《Java》试题及答案选择题(每小题2分,共50分)下列各题A、B、C、D、 四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应的位置上,答在试卷上不得分。(11)下列对Java语言的叙述中,错误的是()…

CanvasRenderingContext2D.fillText(text, x, y [, maxWidth]);

CanvasRenderingContext2D.fillText(text, x, y [, maxWidth]); [, maxWidth]的意思是,方括号代表可有可无,有fillText(text, x, y [, maxWidth])和fillText(text, x, y )2种形式https://www.zhangxinxu.com/wordpress/2018/02/canvas-text-break-line-l…

在.NET里用XSLT时怎么使用msxsl:script

来源:在.NET里用XSLT时怎么使用msxsl:script (思归呓语) 今天在CSDN论坛上看到一个网友在请教关于msxsl:script的用法。感觉这问题也许有点意思,所以在下面简述一下。 在MSXML里,你在msxsl:script里可以使用Javascript…

绕过waf mysql爆库_iwebsec刷题记录-SQL注入漏洞

被推荐了这个web平台,感觉挺适合新手的,网上搜了下没看到有人写wp,这里本入门萌新来稍微整理下自己解题的过程SQL注入漏洞01-数字型注入http://localhost:32774/sqli/01.php?id1发现有报错You have an error in your SQL syntax; check the …

【Vue】组件的基础与组件间通信

转载:https://segmentfault.com/a/1190000016409329 Vue.js 最核心的功能就是组件(Component),从组件的构建、注册到组件间通信,Vue 2.x 提供了更多方式,让我们更灵活地使用组件来实现不同需求。 一、构建组…

java 自定义map_自定义写实现java中map中的功能(简易)

package test;/*** 通过自定义来实现一个map功能* 存放键值对,根据键对象找到一个值对象,确保没有重复*/import java.util.Map;public class test01 {SxtEntry[] arrnew SxtEntry[990];int size;//定义函数实现将键值对放入数组public void put(Object k…

设计模式的功力长了!

今天醒来后,感觉理解了原来比较复杂的一些设计模式,很好,就像小时候感觉长高一样。学习设计模式有一年多了。进步需要时间!

java 验证码校验_JavaWeb验证码校验功能代码实例

后台生成验证码工具方法/** 设置图片的背景色*/public static void setBackGround(Graphics g, int WIDTH, int HEIGHT) {// 设置颜色g.setColor(Color.WHITE);// 填充区域g.fillRect(0, 0, WIDTH, HEIGHT);}/** 设置图片的边框*/public static void setBorder(Graphics g, int…

如何做不浮躁的人

51CTO著名专家老刘,连发了两篇博文,老刘的博客http://2844337.blog.51cto.com/ 都是劝谏我们年轻人不要浮躁。两篇文章用故事教育我们一定不要浮躁,但是如何做到不浮躁,老刘没有说。我想借着这个主题,简单谈一下自己的…

hasset java_java HashSet的使用

今天在写代码时想要使用HashSet,由于之前并不了解,就在网上查了一下原理及使用方法。HashSet原理该类实现了Set接口,HashSet中不允许元素重复,不保证集合中元素的顺序,元素可为null,但最多只能一个。对于 H…

Oracle tips

存储过程无法编译和抛掉!!我在一个项目组中与同事一起开发存储过程,碰到过其他人在调试存储过程时,我无法编译同一个存储过程的问题。但是,现在我使用pl/sql dev将其他的进程都杀掉后--包括在调…

TCP拥塞控制机制

为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”…

java中类似sort_java中的Sort函数,你值得看

基于C语言中的sort如此这么方便,自然而然,java中也有类似C的sort函数。1.普通数组:Arrays.sort(数组名,开始位置,结束位置)。2.类中属性排序:模板:class A{int n;}class cmp implement Comparat…

明天启程去北京:)

去北京参加为期5天的微软sps培训,公司穷呀,所以只能做火车去了,17日下午到达北京,18日-22日5天培训,23日到青岛,呆两三天然后26日下午回家:)有北京和青岛的朋友可以联系我…

多线程java 银行_Java 多线程 之 银行ATM实例

package com.thread;import java.util.Scanner;public class TestBank {public static void main(String[] args) {Bank bank new Bank();Thread lingming new Thread(bank, "李明");Thread wangtao new Thread(bank, "王涛");lingming.start();try {Th…

CSDN登陆校验码模式识别程序

下班后,吃饭前快速写了这么一个东西,以证明图片验证码的脆弱。防君子,不防XX。本来应该使用HTTP协议直接从CSDN的登陆页面DOWN校验图片的,因为时间仓促,所以没有仔细设计。只是做一个示例,还要麻烦大家手工…

C语言中整形数组、字符数组、字符串的区别

一、 第一 整型数组的存放,数组最后是不加\0的,字符串会自动加上,因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的,字符串是一个一个字符存放的,每个字符占一个 二&#xff0c…

java hibernate 表关联_Hibernate多表关联

一、多对一进行关联(多个学生对应同一间宿舍)---学生是主体,宿舍是附体,关联关系在主体学生中设置,在学生类中设置宿舍类,由于宿舍类只有一个可以直接用类来设置,在映射学生类(User)中包含宿舍这个类(Room),在映射配置文件(User.h…

getchar、putchar、puts、gets

getchar(字符) 输入获取一个字符 putchar(字符) 输出控制台一个字符 scanf()格式化输入 printf() 格式化输出 gets(arr) 输入一个字符串给已经声明的数组arr puts(字符串或者字符数组名)输出一个字符串 转载于:https…