- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
方法decorated有什么区别与 @staticmethod
其中一个装饰有 @classmethod
?
最佳答案
也许一些示例代码会有所帮助:请注意 foo
、class_foo
和 static_foo
的调用签名的差异:
class A(object):
def foo(self, x):
print(f"executing foo({self}, {x})")
@classmethod
def class_foo(cls, x):
print(f"executing class_foo({cls}, {x})")
@staticmethod
def static_foo(x):
print(f"executing static_foo({x})")
a = A()
下面是对象实例调用方法的常用方式。对象实例 a
作为第一个参数隐式传递。
a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>, 1)
<小时/>
使用类方法,对象实例的类将作为第一个参数隐式传递,而不是 self
。
a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
您还可以使用该类调用class_foo
。事实上,如果你定义某件事一个类方法,这可能是因为您打算从类而不是从类实例调用它。 A.foo(1)
会引发 TypeError,但 A.class_foo(1)
工作得很好:
A.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
人们发现类方法的一个用途是创建 inheritable alternative constructors .
<小时/>使用静态方法,self
(对象实例)和cls
(类)都不会作为第一个参数隐式传递。它们的行为类似于普通函数,只不过您可以从实例或类中调用它们:
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
静态方法用于将与类有某种逻辑联系的函数分组到类中。
<小时/>foo
只是一个函数,但是当你调用 a.foo
时,你得到的不仅仅是函数,您将获得该函数的“部分应用”版本,其中对象实例 a
绑定(bind)为该函数的第一个参数。 foo
需要 2 个参数,而 a.foo
仅需要 1 个参数。
a
绑定(bind)到 foo
。这就是下面术语“绑定(bind)”的含义:
print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
对于a.class_foo
,a
不会绑定(bind)到class_foo
,而是类A
绑定(bind)到class_foo
。
print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>
这里,使用静态方法,即使它是一个方法,a.static_foo
也只是返回一个很好的 'ole 函数,没有参数绑定(bind)。 static_foo
需要 1 个参数,并且a.static_foo
也需要 1 个参数。
print(a.static_foo)
# <function static_foo at 0xb7d479cc>
当然,当您使用类 A
调用 static_foo
时,也会发生同样的情况。
print(A.static_foo)
# <function static_foo at 0xb7d479cc>
关于python - Python 中的 @staticmethod 和 @classmethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58950703/
我在实践中理解了 @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 需要更多的字母。 使用它的唯一好处(对我来说)可能是代码更清晰,但
我是一名优秀的程序员,十分优秀!