首页 > 解决方案 > 在类上调用方法并手动传递实例是否总是等同于在实例上调用方法?

问题描述

即给定一个类和一个这样的实例:

class Foo:
    def bar(self):
        ...

foo = Foo()

总是Foo.bar(foo)等价于foo.bar(),或者是否存在前一个调用可能导致意外结果的极端情况?

标签: python

解决方案


不必要。描述符协议允许您定义作为属性访问对象的含义。

  • Foo.bar(foo) 相当于Foo.__dict__['bar'].__get__(None, Foo)
  • foo.bar()相当于type(foo).__dict__['bar'].__get__(foo, type(foo))

有两点分歧。首先,type(foo)可能是也可能不是Foo,其次,根据__get__定义的方式,__get__接收foovs.None作为其第一个参数时的结果可能会有所不同。


推荐阅读