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的小整数对象在初始化时创建的,内存地址肯定小,如果你还不信,

不过千万别搞没有意思的操作,

这也是这位兄弟不解的地方,http://stackoverflow.com/questions/1062096/python-notimplemented-constant

Python之美[从菜鸟到高手]--NotImplemented小析,布布扣,bubuko.com

时间: 2024-10-15 09:30:36

Python之美[从菜鸟到高手]--NotImplemented小析的相关文章

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

今天在伯乐在线上看到一篇比较有意思的文章:趣味挑战:写一个 2 + 2 = 5 的程序 ,python版代码如下: patch = '\x312\x2D7' import ctypes;ctypes.c_int8.from_address(id(len(patch))+8).value=eval(patch) 这方法真赞,充分利用了python的小整数缓存方案.我第一眼看patch,这是啥玩意, len(patch)是4,将id(4)+8的地址值修改为12-7,所以2+2=5,非常完美. 如果要

Python之美[从菜鸟到高手]--浅拷贝、深拷贝完全解读(copy源码分析)

可悲的我一直以为copy模块是用C写的,有时候需要深入了解deepcopy,文档描述的实在太简单,还是不知所云. 比如说最近看sqlmap源码中AttribDict的_deepcopy__有些疑惑, def __deepcopy__(self, memo): retVal = self.__class__() memo[id(self)] = retVal for attr in dir(self): if not attr.startswith('_'): value = getattr(se

Python之美[从菜鸟到高手]--读&quot;一道面试题看 HashMap 的存储方式&quot;的联想

今天在伯乐在线 上看到一篇文章,一道面试题看 HashMap 的存储方式,也就是问: 在 HashMap 中存放的一系列键值对,其中键为某个我们自定义的类型.放入 HashMap 后,我们在外部把某一个 key 的属性进行更改,然后我们再用这个 key 从 HashMap 里取出元素,这时候 HashMap 会返回什么? 如何面试者直接答"这要看自定义类型的hash值了",我想面试官会非常满意. 联想到python中dict的实现,python中字典一般不存在这个问题,因为key的ha

Python之美[从菜鸟到高手]--threading daemon线程原理解读

事情的起因是我在看下面一段代码遇到的疑惑,明明是while True,为什么代码没有死循环?? class D(threading.Thread): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): while True: url = self.queue.get() self.download_file(url) self.queue.task_done()

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

很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确实很低,一方面,Java语言采用面向对象思想,这也决定了其必然是开发效率高,执行效率低.另一方面,Java语言对程序员做了一个美好的承诺:程序员无需去管理内存,因为JVM有垃圾回收(GC),会去自动进行垃圾回收. 其实不然: 1.垃圾回收并不会按照程序员的要求,随时进行GC. 2.垃圾回收并不会及时

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

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

Java之美[从菜鸟到高手演练]之Arrays类及其方法分析

作者:二青 个人站点:zhangerqing.cn    邮箱:[email protected]    微博:http://weibo.com/xtfggef 本章主要介绍一下 java.util.Arrays类的重点方法,包括怎么使用及实现原理.这是一个算法类,主要是辅助数组类实现一些排序.搜索等功能,同时也支持数组到List的转换.本章系Java之美[从菜鸟到高手演练]系列之Arrays类及其方法分析,如果有任何问题,欢迎通过上面任何一种方式与我联系! 排序 本文使用JDK1.8.0_25

Java之美[从菜鸟到高手演变]之设计模式(zz)

http://blog.csdn.net/zhangerqing/article/details/8194653 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理

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

JDK动态代理的实现及原理 作者:二青 邮箱:[email protected]     微博:http://weibo.com/xtfggef 动态代理,听上去很高大上的技术,在Java里应用广泛,尤其是在Hibernate和Spring这两种框架里,在AOP,权限控制,事务管理等方面都有动态代理的实现.JDK本身有实现动态代理技术,但是略有限制,即被代理的类必须实现某个接口,否则无法使用JDK自带的动态代理,因此,如果不满足条件,就只能使用另一种更加灵活,功能更加强大的动态代理技术-- CG