Python之美[从菜鸟到高手]--NotImplemented小析
今天写代码时无意碰到NotImplemented,我一愣。难道是NotImplementedError的胞弟,所以略微研究了一下。
NotImplemented故名思议。就是“未实现”。通常是用在一些比較算法中的,如class的__eq__,__lt__等,注意NotImplemented并非异常,所以不能
使用raise,当没有实现时应该是return NotImplemented。
我们能够看看django中的Field的实现,
@total_ordering
class Field(object):
"""Base class for all field types"""
def __eq__(self, other):
# Needed for @total_ordering
if isinstance(other, Field):
return self.creation_counter == other.creation_counter
return NotImplemented def __lt__(self, other):
# This is needed because bisect does not take a comparison function.
if isinstance(other, Field):
return self.creation_counter < other.creation_counter
return NotImplemented
那提供NotImplemented有什么优点?优点就在于假设A == B NotImplemented,会去调用B的__eq__方法,假设B也没有会调用cmp方法。
我们看以下一个样例:
class Person:
def __init__(self, age):
self.age = age def __eq__(self, other):
if not isinstance(other, Person):
return NotImplemented
return self.age == other.age
假设你们稳定库中有这么一段代码。并且Person可能包括了非常多字段。可是你想实现Person和整数比較。
person=Person(10)
print person == 10 #False
非常遗憾,上面结果是False,不符合我们要求,至于为什么是10,稍后再说,我们先看看怎样解决问题?
事实上这时你能够简单封装一个age对象,
class Age:
def __init__(self, age):
self.age = age def __eq__(self, other):
return self.age == other.age person=Person(10)
age=Age(10)
print person == age #True
ok,非常完美,那我们从上面能得到什么结论呢?
我们在写一些基础代码时,即使是没实现。也不要raise NotImplementedError,而是return NotImplemented,相当于提供给其他不同对象的比較接口,这对
代码扩展非常有优点。
我们再来看看上面那么直接和10比,为什么是False?
先看以下这段代码:
class A:
def __lt__(self, a):
return NotImplemented def __add__(self ,a):
return NotImplemented print A() < A() # True
print A() < 1 # False
非常奇怪吧,明明已经直接是NotImplemented,为什么还有结果?
大胆推測,前面说明最后会使用cmp比較,非常明显当都未定义时会比較id值。也就是内存地址。后创建的对象内存地址大,就是这个道理。
至于A() < 1,由于python的小整数对象在初始化时创建的。内存地址肯定小。假设你还不信。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlZ3VhbmdoYWlkYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
只是千万别搞没有意思的操作。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlZ3VhbmdoYWlkYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
这也是这位兄弟不解的地方,http://stackoverflow.com/questions/1062096/python-notimplemented-constant
Python之美[从菜鸟到高手]--NotImplemented小析的更多相关文章
- Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)
我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...
- Python之美[从菜鸟到高手]--深刻理解原类(metaclass)
本来想自己写这篇文章的,可当我读了这篇文章http://blog.jobbole.com/21351/,我打消了这个念头,因为肯定写的没有人家的好,说的通俗易懂,面面俱到.就厚着面皮修改下格式,测试下 ...
- Python之美[从菜鸟到高手]--生成器之全景分析
yield指令,可以暂停一个函数并返回中间结果.使用该指令的函数将保存执行环境,并且在必要时恢复. 生成器比迭代器更加强大也更加复杂,需要花点功夫好好理解贯通. 看下面一段代码: def gen(): ...
- Python之美[从菜鸟到高手]--urlparse源码分析
urlparse是用来解析url格式的,url格式如下:protocol :// hostname[:port] / path / [;parameters][?query]#fragment,其中; ...
- Python之美[从菜鸟到高手]--2+2=5
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yueguanghaidao/article/details/35644165 今天在伯乐在线 ...
- Python之美[从菜鸟到高手]--Python垃圾回收机制及gc模块详解
http://blog.csdn.net/yueguanghaidao/article/details/11274737
- Java之美[从菜鸟到高手演变]之设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理
Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理 JDK动态代理的实现及原理 作者:二青 邮箱:xtfggef@gmail.com 微博:http://weibo.com/xtfg ...
随机推荐
- Cognos备份与恢复方案
场景:早上来上班,突然发现COGNOS服务器挂掉了,比如硬盘彻底坏掉了,不能恢复了,那该怎么办?前提是肯定要有备份啊. 备份内容: A:FM模型备份OKB:Cognos内容库备份OK 恢复过程: 1: ...
- (剑指Offer)面试题39:二叉树的深度
题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 结点的定义如下: struct TreeNode{ int val; ...
- Android程序怎么做单元测试
如何进行Android单元测试 Menifest.xml中加入: <application>中加入: <uses-library android:name="android ...
- .NET破解之爱奇迪(三)
本教程只能用于学习研究,不可进行任何商业用途.如有使用,请购买正版,尊重他人劳动成果和知识产权! .NET破解之爱奇迪(一) .NET破解之爱奇迪(二) 一打开软件,就看到各种注册和未注册提示信息,就 ...
- SQL语言 之 事务控制
一.概述 事务是一些数据库操作的集合,这些操作由一组相关的SQL语句组成(只能是 DML 语句),它们是一个有机的整体,要么全部成功执行,要么全部不执行.事务时数据库并发控制和恢复技术的基本单位. 事 ...
- UDP socket也可以使用connect系统调用
UDP socket也可以使用connect系统调用 UDP是一个无连接的协议,因此socket函数connect()似乎对UDP是没有意义的,然而事实不是这样.它可以用来指定本地端口和本地地址,来建 ...
- iOS 图片比例缩放
方法 //Resize image - (UIImage *)resizeImage:(UIImage *)image withQuality:(CGInterpolationQuality)qual ...
- Unity3d中使用log4net
原地址:http://www.cnblogs.com/koalaylj/archive/2012/09/04/2670629.html 最近在用unity3d开发Android上的游戏,一直Debug ...
- Python方法完成农历日历功能代码
来自 #coding=utf-8 #****************************************************************************** # 下 ...
- springmvc处理流程
SpringMVC核心处理流程: 1.DispatcherServlet前端控制器接收发过来的请求,交给HandlerMapping处理器映射器 2.HandlerMapping处理器映射器,根据请求 ...