gpt4 book ai didi

python - staticmethod 对象描述的含义?

转载 作者:行者123 更新时间:2023-12-02 03:03:03 34 4
gpt4 key购买 nike

我在实践中理解了 @staticmethod 装饰器。但是模拟静态方法的一个错误让我陷入了 Python 语义兔子洞。 The standard type hierarchy中的描述部分让我感到困惑:

Static method objects provide a way of defeating the transformation of function objects to method objects described above. A static method object is a wrapper around any other object, usually a user-defined method object. When a static method object is retrieved from a class or a class instance, the object actually returned is the wrapped object, which is not subject to any further transformation. Static method objects are not themselves callable, although the objects they wrap usually are. Static method objects are created by the built-in staticmethod() constructor.

staticmethod()构造函数将函数对象作为唯一参数。它如何包装函数对象以外的任何其他对象?即使这没有失败,它又有什么意义呢?

它通常如何包装用户定义的方法对象而不是函数对象?用户定义的方法对象,在调用时,将调用它们的对象添加到参数列表的开头,然后调用存储在类上的函数对象(忽略所有各种特殊情况)。

为什么静态方法对象本身不可调用?那么,如何调用这些工作呢?

最佳答案

你可以看到staticmethod可以接受任何参数:

>>> x = staticmethod(3)

而且它确实不可调用:

>>> x()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'staticmethod' object is not callable

staticmethod只是存储对其参数的引用。当您尝试访问 staticmethod 时,“魔法”就会发生。对象作为 class 的属性对象或类的实例。当你这样做时,你会得到 staticmethod 的结果。方法的 __get__方法,这是...您最初包装的东西。

>>> x.__get__(x)
3

不用担心我们为什么通过了x作为论点;可以说,staticmethod.__get__大多数情况下会忽略它的论点。

当您将函数包装在 class 中时声明,staticmethod保存对该函数的引用,以便稍后在您请求时调用。

>>> class Foo(object):
... @staticmethod
... def x():
... pass
...
>>> type(Foo.__dict__['x'])
<type 'staticmethod'>
>>> type(Foo.x)
<type 'function'>

实例方法的工作方式是因为 function.__get__返回 method 的实例,这在某种意义上只是原始函数部分应用了调用它的实例。你可能已经看到 x.foo()type(x).foo(x)相同. 原因是真的因为x.foo首先解析为 type(x).foo ,它本身的计算结果为 type(x).__dict__['foo'].__get__(x, type(x) . function.__get__ 的返回值基本上是函数 foo 的包装器, 但带有 x已作为第一个参数提供。

staticmethod的主要目的是提供一个不同的__get__方法。

顺便说一句,classmethod服务于相同的目的。 classmethod.__get__返回以 class 作为第一个参数调用包装函数的东西,无论您是从类的实例还是类本身调用类方法。

关于python - staticmethod 对象描述的含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59654024/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com