运营商的非常奇怪的行为是与方法

为什么第一个结果是False ,如果不是True

 >>> from collections import OrderedDict >>> OrderedDict.__repr__ is OrderedDict.__repr__ False >>> dict.__repr__ is dict.__repr__ True 

对于用户定义的函数,在Python 2中,通过描述符协议按需创build未绑定绑定的方法; OrderedDict.__repr__就是这样的一个方法对象,因为被包装的函数被实现为一个纯Python函数 。

描述符协议将对支持它的对象调用__get__方法 ,所以每当你尝试访问OrderedDict.__repr__ ,都会调用__repr__.__get__() 对于类None (无实例)和类对象本身传入。因为每次调用函数__get__方法都会得到一个新的方法对象,因此is失败。 这是不一样的方法对象。

dict.__repr__不是一个自定义的Python函数,而是一个C函数,它的__get__描述符方法本质上只是在类上访问时返回self 。 访问属性每次给你相同的对象,工作is如此:

 >>> dict.__repr__.__get__(None, dict) is dict.__repr__ # None means no instance True 

方法有一个引用包装函数的__func__属性,用它来testing标识:

 >>> OrderedDict.__repr__ <unbound method OrderedDict.__repr__> >>> OrderedDict.__repr__.__func__ <function __repr__ at 0x102c2f1b8> >>> OrderedDict.__repr__.__func__.__get__(None, OrderedDict) <unbound method OrderedDict.__repr__> >>> OrderedDict.__repr__.__func__ is OrderedDict.__repr__.__func__ True 

Python 3消除了未绑定的方法, function.__get__(None, classobj)返回函数对象本身(所以它的行为就像dict.__repr__一样)。 但是你会看到与绑定方法相同的行为,即从实例中检索的方法。

两个OrderedDict.__repr__没有绑定到同一个对象。 如果你试试:

  OrderedDict.__repr__ == OrderedDict.__repr__ 

你会看到他们有相同的价值。