python - 在类上调用方法并手动传递实例是否总是等同于在实例上调用方法?
问题描述
即给定一个类和一个这样的实例:
class Foo:
def bar(self):
...
foo = Foo()
总是Foo.bar(foo)
等价于foo.bar()
,或者是否存在前一个调用可能导致意外结果的极端情况?
解决方案
不必要。描述符协议允许您定义作为属性访问对象的含义。
Foo.bar(foo)
相当于Foo.__dict__['bar'].__get__(None, Foo)
foo.bar()
相当于type(foo).__dict__['bar'].__get__(foo, type(foo))
有两点分歧。首先,type(foo)
可能是也可能不是Foo
,其次,根据__get__
定义的方式,__get__
接收foo
vs.None
作为其第一个参数时的结果可能会有所不同。
推荐阅读
- sql - 在 python/sqlite3 中使用 for 循环设置与另一个表相关的外键
- php - 从 php 运行 docker 命令
- terraform - Terraform (v0.13) 如何获取(第三方)提供程序二进制文件的最新版本?
- regex - 使用正则表达式在字符串中添加额外的单引号,以便动态传递
- c++ - 将 `int*` 转换为指向 bitset 的指针时会发生什么
- javascript - 我想点击一个 div 并根据链接(动态)进入一个带有不同图像的新页面
- arrays - 为什么此列中最后一个非空单元格的 Google 表格公式有效?
- go - 在 Go 中获取前 3 个月的第一个和最后一个日期
- python - 在 Python 中命名常量类属性
- swift - WKWebview - 加载资源失败:请求超时