gpt4 book ai didi

python - Python 中的 @staticmethod 和 @classmethod

转载 作者:太空宇宙 更新时间:2023-11-03 20:06:22 24 4
gpt4 key购买 nike

方法decorated有什么区别与 @staticmethod其中一个装饰有 @classmethod

最佳答案

也许一些示例代码会有所帮助:请注意 fooclass_foostatic_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_fooa不会绑定(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/

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