乐趣区

关于python:PythonNotImplemented小析

明天写代码时无心碰到 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

本文转自 https://blog.csdn.net/yueguanghaidao/article/details/38641251?spm=1001.2014.3001.5502,如有侵权,请分割删除。

退出移动版