流畅python学习笔记:第十二章:子类化内置类型

子类化内置类型
在python2.2之后,内置类型都可以子类化,但是有一个注意事项:内置类型不会调用用户定义的类覆盖的特殊方法。这个说起来比较绕口,什么意思呢。我们来看下下面的代码:
class DopperDict(dict):
    def __setitem__(self, key, value):
        super(DopperDict,self).__setitem__(key,[value]*2) ⑴

if __name__=="__main__":
    dd=DopperDict(one=1)   ⑵
    print dd
    dd[‘two‘]=2            ⑶
    print dd
    dd.update(three=3)      ⑷
    print dd
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter12.py
{‘one‘: 1}
{‘two‘: [2, 2], ‘one‘: 1}
{‘three‘: 3, ‘two‘: [2, 2], ‘one‘: 1}
在1中,重写了__setitem__方法,并委托超类进行赋值
在2中,继承自dict的__init__忽略了被覆盖的__setitem__方法,one值并没有重复
在3 中,[]运算符会调用我们覆盖的__setitem__方法,按照预期工作。Two对应的是两个重复的值。
在4中,继承自dict的update方法也不使用我们覆盖的__setitem__方法,three的值没有重复。
这就会导致初始化和赋值的时候得到的结果不一样,那么如何解决呢:
可以使用collections.UserDict模块。
class AnswerDict(dict):
    def __getitem__(self, item):
        return 42

class DopperDict(collections.UserDict):
    def __setitem__(self, key, value):
        super(DopperDict,self).__setitem__(key,[value]*2) 
在这种情况下,初始化调用覆盖的__setitem__方法。
 
本章还介绍了关于多重继承的方法。这个在之前的一篇帖子中介绍过。请参考:http://www.cnblogs.com/zhanghongfeng/p/7190732.html

时间: 2024-12-20 19:20:53

流畅python学习笔记:第十二章:子类化内置类型的相关文章

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

流畅python学习笔记:第十一章:抽象基类

__getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克牌的例子来看下 class FrenchDeck:     ranks=[str(n) for n in range(2,11)] + list('JQKA')     suits='spades diamonds clubs hearts'.split()     def __init__(sel

Python学习笔记(十二)

一.报错处理 Python中可以通过: try: 相关语句块 except 错误类型 as e: print("except:",e) finally: print("finally") 来进行错误的侦测和处理 二.Python中错误的继承 Python中的错误也是class Python中所有的错误类型都继承自BaseException 如果Python中的错误没有被捕获,则其会一层一层的向上抛出,直至被编译器所捕获 三.记录错误 Python中可以通过loggi

流畅python学习笔记:第十三章:重载运算符__add__,__iadd__,__radd__,__mul__,__rmul__,__neg__,__eq__,__invert__,__pos__

在前面第十章以及第一章的时候介绍了Vector对象的运算符重载.第十三章专门介绍运算符重载.这里我们看几个之前没讲过的运算符__neg__,__pos__,__invert__ class Vector(object):     def __init__(self,x):         self.x=x     def __neg__(self):         return "Vector(%d)" % (-self.x)     def __str__(self):      

流畅python学习笔记第十八章:使用asyncio包处理并发(一)

首先是线程与协程的对比.在文中作者通过一个实例分别采用线程实现和asynchio包实现来比较两者的差别.在多线程的样例中,会用到join的方法,下面来介绍下join方法的使用. 知识点一:当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子如下:. def run():

Python学习笔记第二十二周(前端知识点补充)

目录: 一.伪类 二.样式 1.字体 2.背景图片 3.margin和padding 内容: 一.伪类 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> a:link{ background-color:red; } a:hover{ backgrou

Python学习笔记(十二) 使用模块

摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431845183474e20ee7e7828b47f7b7607f2dc1e90dbb000 本文章完全用于个人复习使用,侵删: 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env python3 # -*- coding: utf-8 -*- ' a test module ' _

python学习笔记(十二):发送邮件

我们在开发程序的时候,有时候需要开发一些自动化的任务,执行完之后,将结果自动的发送一份邮件,python发送邮件使用smtplib模块,是一个标准包,直接import导入使用即可,代码如下: import smtplib from email.mime.text import MIMEText email_host = 'smtp.163.com' #邮箱地址 email_user = '[email protected]' # 发送者账号 email_pwd = 'xxxx' # 发送者密码

Python 学习笔记(十二)Python文件和迭代(一)

文件 文件和文件夹 文件:文本文件.二进制文件 文件夹:(windows) G:\pythonWorkspace\python\study (linux/mac) /home/workspace/python 注意:文件夹路径的斜杠linux与windows不同 windows下文件路径:示例 1 >>> p1="G:\pythonWorkspace\python\study\test.txt" 2 >>> p2 =r"G:\pythonW

《JAVA编程思想》学习笔记——第十二章 通过异常处理错误

Java的基本理念是 "结构不佳的代码不能运行" 发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前.然而,编译期间并不能找出所有的错误,余下的问题必须在运行期间解决.这就需要错误源能通过某种方式,把适当的信息传递给某个接收者----该接收者将知道如何正确处理这个问题. 异常情形是指阻止当前方法或作用域继续执行的问题. 当抛出异常后,有几件事会随之发生.首先,同Java中其它对象的创建一样,将使用new在堆上创建异常对象.然后,当前的执行路径被终止,并且从当前环境中弹出对异常对