- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在实践中理解了 @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/
我在实践中理解了 @staticmethod 装饰器。但是模拟静态方法的一个错误让我陷入了 Python 语义兔子洞。 The standard type hierarchy中的描述部分让我感到困惑:
我在实践中理解了 @staticmethod 装饰器。但是模拟静态方法的一个错误让我陷入了 Python 语义兔子洞。 The standard type hierarchy中的描述部分让我感到困惑:
我做了这两门课: class A: @staticmethod def f(x): print("x is", x) class B: def f(x):
我最近使用 pycharm 和 sonarqube 来审查我的代码。这两个工具都建议更新许多方法,例如 get_success_url,它们在其主体中未使用 self 以使用 @staticmetho
问题就是这么说的。我有一个在辅助函数中调用静态方法的抽象类,我希望子类简单地定义静态方法并使用它运行。 也许我可以使用 getattr 之类的东西?我应该改用@classmethod 吗? 最佳答案
我只是不明白为什么我们需要使用@staticmethod。让我们从一个例子开始。 class test1: def __init__(self,value): self.val
假设我有一个 class这需要一个函数(或者我应该说方法)是: 独立于我的class实例 - 不需要 self争论; 仅在我的 class 中被调用对象 我在任何时候都不需要访问它(例如覆盖它); 我
我有这个代码: class A(object): @staticmethod def open(): return 123 @staticmethod
我正在写一个非常普通的 django 管理类,带有这样的自定义操作: class DeviceAdmin(admin.ModelAdmin): actions = ("enable", "di
您好,我正在尝试创建一个装饰器,但收到staticmethod object not callable错误,下面是我的代码 from db.persistence import S3Mediator
class UserInput(): users=[] def __init__(self, name,lista,listb,listc,listd): self.n
关于为什么/何时应该使用类方法与静态方法,有几个关于 SO 的很好的解释,但我一直无法找到关于何时使用静态方法而不是根本没有修饰的答案。考虑一下 class Foo(object):
在 Python 3.x 中,我可以用 bar() 做什么而不能用 foo() 做什么? class A: def foo(): print("some code")
我想创建元类,它将用跟踪装饰器装饰每个函数。 所以我得到了这个: from functools import wraps from inspect import getfile from arrow
我正在尝试实现 infer_class 函数,给定一个方法,找出该方法所属的类。 到目前为止,我有这样的东西: import inspect def infer_class(f): if in
我有一个 python 类,它有多个方法。我已经通过 @staticmethod 实例定义了我的方法,我想从我的主函数 (main_function) 内部调用我的类的其他方法。我想我需要 self
我有一个简短的问题。我正在尝试向模型中添加一个字段,该字段是 2 个字段的总和。 例如: class MyModel(models.Model) fee = models.DecimalF
我想了解静态方法在内部是如何工作的。我知道如何使用 @staticmethod 装饰器,但我将避免在这篇文章中使用它,以便更深入地了解静态方法的工作原理并提出我的问题。 根据我对 Python 的了解
在 Python 中,在一个类中,静态方法可以调用在同一类中定义的另一个局部函数/方法吗? 我尝试了以下代码并收到一条错误消息,指出 foo1() 未定义。 class trialOne(object
我想知道您是否在代码中使用了@staticmethod 装饰器。 我个人不使用它,因为写 @staticmethod 比写 self 需要更多的字母。 使用它的唯一好处(对我来说)可能是代码更清晰,但
我是一名优秀的程序员,十分优秀!