今天写代码时无意碰到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小析的更多相关文章

  1. Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)

    我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...

  2. Python之美[从菜鸟到高手]--深刻理解原类(metaclass)

    本来想自己写这篇文章的,可当我读了这篇文章http://blog.jobbole.com/21351/,我打消了这个念头,因为肯定写的没有人家的好,说的通俗易懂,面面俱到.就厚着面皮修改下格式,测试下 ...

  3. Python之美[从菜鸟到高手]--生成器之全景分析

    yield指令,可以暂停一个函数并返回中间结果.使用该指令的函数将保存执行环境,并且在必要时恢复. 生成器比迭代器更加强大也更加复杂,需要花点功夫好好理解贯通. 看下面一段代码: def gen(): ...

  4. Python之美[从菜鸟到高手]--urlparse源码分析

    urlparse是用来解析url格式的,url格式如下:protocol :// hostname[:port] / path / [;parameters][?query]#fragment,其中; ...

  5. Python之美[从菜鸟到高手]--2+2=5

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yueguanghaidao/article/details/35644165     今天在伯乐在线 ...

  6. Python之美[从菜鸟到高手]--Python垃圾回收机制及gc模块详解

    http://blog.csdn.net/yueguanghaidao/article/details/11274737

  7. Java之美[从菜鸟到高手演变]之设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  8. Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  9. Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理

    Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理 JDK动态代理的实现及原理 作者:二青 邮箱:xtfggef@gmail.com     微博:http://weibo.com/xtfg ...

随机推荐

  1. [AngularJS] Angular 1.3 ngAria - 2

    This is an highlight about ngAira in Angular Document abou ngAira Where can use ngAria? Currently, n ...

  2. (剑指Offer)面试题57:删除链表中的重复结点

    题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 ...

  3. 如何在代码中设置以dp为单位的长度

    获取当前屏幕的密度系数 ,并设置控件以dp为单位的长宽   float density = getResources().getDisplayMetrics().density;   params = ...

  4. VS选项中没有C#相关设置选项?

    在VS中,行号的设置在工具-选项-文本编辑器,可里面没有VS,我还以为是之前卸载了SP1后造成的. 原来是因为,VS默认环境设置的VB,选项对话框左下角有"显示所有设置"的复选框, ...

  5. Could not parse the file: d:\matlab7\toolbox\ccslink\ccslink\info.xml

    找到安装目录下的info.xml文件,用记事本打开. 我的安装目录是:D:\MATLAB7\toolbox\ccslink\ccslink 用记事本打开,显示如下内容: <productinfo ...

  6. Unity发布各平台路径

    #if UNITY_EDITOR string filepath = Application.dataPath + "/StreamingAssets"; #elif UNITY_ ...

  7. Python模块学习 ---- logging 日志记录

    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4cp ...

  8. javascript 的继承实例

    shape.prototype = { getEdge:function(){ return this.edge; }, getArea:function(){ return this.a*this. ...

  9. Drupal 7 driver for SQL Server and SQL Azure

    Drupal 7 driver for Microsoft SQL Server database engines. It supports both SQL Server (version 2008 ...

  10. MySQL数据约束和关联查询

    1 默认值deafult:在建表的时候字段后使用 default ,默认值字段允许为null. 2 非空 not null:在建表的时候字段后使用  not null. 非空字段必须赋值,并且不能是n ...