Python:使用__self__代替self作为“示例方法”的第一个参数

kdfy810k  于 2023-05-16  发布在  Python
关注(0)|答案(2)|浏览(183)

我最近看到了这样一段代码:

class InlineParameterResolver:
    def resolve(__self__, value: str) -> Any:
        return value

现在,我知道这段代码很奇怪,因为类本身没有示例方法,也没有init方法来创建示例并操作其内部属性,但是将__self__作为第一个参数是否有任何特殊的功能/行为?
我试着在谷歌上寻找答案,但找不到任何东西,我只是想知道这是一个学习的机会,还是我只是从一个没有太多语言经验的人那里阅读Python。
干杯。

ukdjmx9f

ukdjmx9f1#

使用__self__作为第一个参数是否有任何特殊的功能/行为?
没有特殊的功能或行为。即使使用self只是第一个位置参数的命名约定,使用foo或其他任何东西都可以工作。
但是,使用名称__self__是不可取的,因为它在datamodel中已经有了不同的含义:当一个示例方法对象是通过一个类的示例从类中检索一个函数对象来创建的,它的__self__属性就是示例,并且该方法对象被称为是绑定的。

>>> class A:
...     def f(self):
...         pass
... 
>>> a = A()
>>> a.f.__self__
<__main__.A object at 0xdeadbeef>

使用双下划线名称作为函数参数很奇怪,会引起混淆,所以我建议避免这样做。

cyvaqqii

cyvaqqii2#

你描述了一些来历不明的代码:

def resolve(__self__, value):

其中任何一个的行为都是相同的:

def resolve(foo, value):

    def resolve(baz, value):

    def resolve(self, value):

最好是最后一个,因为它是传统的。
我们写代码来和机器交流,是的。但是主要我们写作是为了向读者清楚地传达作者的意图。在python上下文中,不使用self(或cls用于类方法)会模糊意图,并让Gentle Reader感到困惑。走常规路线。

相关问题