“特殊方法的隐式使用始终依赖于特殊方法的类级绑定”

提姆

我很难理解Python的最后一部分(黑体)

每个实例的方法

实例可以对所有属性(包括可调用属性(方法))具有特定于实例的绑定。对于方法,就像其他任何属性(绑定到覆盖描述符的属性除外)一样,特定于实例的绑定将隐藏类级别的绑定:当属性查找直接在实例中找到绑定时,属性查找将不考虑该类。可调用属性的特定于实例的绑定不会执行第110页上的“绑定和未绑定方法”中详述的任何转换:属性引用返回的是与之前直接绑定到实例属性的完全相同的可调用对象。

但是,这并不起作用,正如您可能期望的那样,由于各种操作而导致Python隐式调用的特殊方法的按实例绑定,如第123页的“特殊方法”所述。特殊方法的此类隐式使用始终依赖于特殊方法的类级绑定(如果有)。例如:

def fake_get_item(idx): return idx
class MyClass(object): pass
n = MyClass()
n.__getitem__ = fake_get_item
print(n[23])                      # results in:
# Traceback (most recent call last):
#   File "<stdin>", line 1, in ?
# TypeError: unindexable object

具体是什么意思?

为什么出现示例错误?

谢谢。

塞弗特

忽略所有的细节,它基本上说,特殊的方法(定义蟒蛇数据模型-通常这些都是先从两个下划线,并以两个下划线结尾的方法和很少,如果有的话,直接调用)将永远不会被使用隐含从实例,即使在那里定义:

n[whatever]  # will always call type(n).__getitem__(n, whatever)

这与首先​​检查实例的属性查找不同:

def fake_get_item(idx): 
    return idx

class MyClass(object): 
    pass

n = MyClass()
n.__getitem__ = fake_get_item
print(n.__getitem__(23))     # works because attribute lookup checks the instance first

文档中有一整节内容(包括基本原理):“特殊方法查找”

3.3.9。特殊方法查找

对于自定义类,只有在对对象的类型(而不是在对象的实例字典中)进行定义的情况下,才能保证对特殊方法的隐式调用可以正常工作。该行为是以下代码引发异常的原因:

>>> class C:
...     pass
...
>>> c = C()
>>> c.__len__ = lambda: 5
>>> len(c)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'C' has no len()

此行为背后的原理在于许多特殊方法,例如__hash__()__repr__()由所有对象(包括类型对象)实现。如果这些方法的隐式查找使用常规查找过程,则在对类型对象本身进行调用时它们将失败:

>>> 1 .__hash__() == hash(1)
True
>>> int.__hash__() == hash(int)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor '__hash__' of 'int' object needs an argument

[...]

__getattribute__()以这种方式绕过机器为解释器内的速度优化提供了很大的空间,但以牺牲一些特殊方法的灵活性为代价(特殊方法必须在类对象本身上设置,以便由解释器一致地调用) 。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有哪些方法可以测试依赖于静态方法的方法?

使用依赖于上下文绑定的选择编写类型类

使用依赖于其他类的类将CSS应用于任何元素

如何测试依赖于环境变量的Rust方法?

如何创建依赖于其他两种显示方法的显示方法?

使用名为“ clone”的隐式类方法编译错误

依赖于特定类类型的C ++模板方法?

如何在Scala中将依赖于路径的类型与类型类一起使用

域模型类是否应该始终依赖于原语?

当类依赖于隐式时,是否有惯用的方法将类转换为对象?

即使没有直接调用“ if”,它们是否也可以隐式访问类的特殊方法?

单元测试依赖于StreamReader读取文件的方法

如何记录依赖于外部包中的类的S4方法?

Angular 7测试依赖于私有方法的公共方法

在Startup类中获取依赖于DI的类的实例

确保隐式定义始终具有较高/较低优先级的一般方法

使用空手道进行依赖于数据库状态的测试的好方法吗?

将依赖于Iterator的方法更改为依赖ArrayList或任何替代方法(Java)

PHPUnit测试一个依赖于另一个方法的方法

使用隐式类重写方法

使用RSpec测试依赖于外部Cassandra调用的方法

测试依赖于类路径上类的存在的代码

EmberJS:全局类函数使用Ember-Simple-Auth依赖于会话变量。最佳实践?

如何使用@InjectMocks依赖于另一个要模拟的类?

使用Jest对依赖于HTTP调用的代码进行单元测试的最佳方法?

如何使用依赖于已运行的TestSetup方法的NUnit测试用例?

Scala:在隐式参数中抽象依赖于路径的类型

使用经典的重载解析规则创建依赖于 std::invoke 的重载集类

获取和设置依赖于其他字段的方法

TOP 榜单

热门标签

归档