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

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

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

2 Solutions collect form web for “运营商的非常奇怪的行为是与方法”

对于用户定义的函数,在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__ 

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

  • 为什么从列表中创build列表使其变大?
  • len()关于集合和列表的复杂性
  • 在Python中如何引用variables
  • 在Python中提高超大字典的性能
  • 列表理解过滤 - “set()陷阱”
  • 为什么一个类的主体在定义时间被执行?
  • 如何交换python元组(a,b)=(b,a)中的成员在内部工作?
  • 什么是正确的方式来覆盖Python中的对象的复制/深层拷贝操作?
  • “是”运算符的行为意外与非caching整数
  • 为什么元组的内存空间less于列表?
  • Python中x ='y''z'的底层是什么?