Staticmethod与classmethod有何本质差异?

2026-05-26 11:431阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计891个文字,预计阅读时间需要4分钟。

Staticmethod与classmethod有何本质差异?

文章来源:Staticmethod和classmethod的区别 - 代码领悟code05.com

问题:Staticmethod和classmethod的区别?使用@staticmethod装饰的函数和使用@classmethod装饰的函数有什么区别?

使用@staticmethod装饰的函数和使用@classmethod装饰的函数的主要区别在于它们绑定的对象不同。

1. @staticmethod装饰的函数不绑定任何类或实例,可以像普通函数一样调用。例如:

pythonclass MyClass: @staticmethod def my_function(): print(这是一个静态方法,不依赖于类或实例)

MyClass.my_function() # 直接调用

2. @classmethod装饰的函数绑定到类本身,可以通过类名或实例调用。例如:

pythonclass MyClass: def __init__(self): self.value=10

@classmethod def my_class_method(cls): print(这是一个类方法,绑定到类本身) print(cls) # 输出类本身

MyClass.my_class_method() # 通过类名调用my_instance=MyClass()my_instance.my_class_method() # 通过实例调用

总结:@staticmethod装饰的函数不依赖于类或实例,而@classmethod装饰的函数绑定到类本身。

文章来源:​​Staticmethod和classmethod的区别 - 代码领悟code05.com​​

提问:Staticmethod和classmethod的区别

用​​@staticmethod​​​修饰的函数和用​​@classmethod​​修饰的函数有什么区别?

Staticmethod与classmethod有何本质差异?

回答:

也许一些示例代码会有所帮助:注意​​foo​​​,​​class_foo​​​和​​A​​的调用签名的差异:

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)

​使用classmethods​,对象实例的类作为第一个参数隐式传递,而不是​​self​​。

a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)

您也可以使用类调用​​class_foo​​​。 事实上,如果你定义的东西是 一个classmethod,这可能是因为你打算从类而不是从类实例调用它。 ​​​A.foo(1)​​​会引发一个TypeError,但是​​A.class_foo(1)​​工作得很好:

A.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)

人们为类方法找到的一个用途是创建​​可继承的替代构造函数​​。


​使用staticmethods​,​​self​​​(对象实例)和​​cls​​(类)都不会隐式传递作为第一个参数。 它们的行为就像普通函数,除了你可以从实例或类中调用它们:

a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)

Staticmethods用于将与类具有某种逻辑连接的函数分组到类。


​​foo​​​只是一个函数,但是当你调用​​a.foo​​​时,你不只是得到函数, 您将获得函数的"部分应用"版本,对象实例​​​a​​​绑定为函数的第一个参数。 ​​foo​​​期望2个参数,而​​a.foo​​只期望1个参数。

​​a​​​绑定到​​foo​​。 这就是下面"绑定"一词的含义:

print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

使用​​a.class_foo​​​,​​a​​​不绑定到​​class_foo​​​,而是类​​A​​​绑定到​​class_foo​​。

print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>

在这里,使用staticmethod,即使它是一个方法,​​a.static_foo​​​只是返回 一个好的'ole函数,没有参数绑定。 ​​​A​​​期望1个参数,并且 ​​​a.static_foo​​也期待1个论点。

print(a.static_foo)
# <function static_foo at 0xb7d479cc>

当然,当你用类​​A​​​调用​​A​​时,也会发生同样的事情。

print(A.static_foo)
# <function static_foo at 0xb7d479cc>
标签:

本文共计891个文字,预计阅读时间需要4分钟。

Staticmethod与classmethod有何本质差异?

文章来源:Staticmethod和classmethod的区别 - 代码领悟code05.com

问题:Staticmethod和classmethod的区别?使用@staticmethod装饰的函数和使用@classmethod装饰的函数有什么区别?

使用@staticmethod装饰的函数和使用@classmethod装饰的函数的主要区别在于它们绑定的对象不同。

1. @staticmethod装饰的函数不绑定任何类或实例,可以像普通函数一样调用。例如:

pythonclass MyClass: @staticmethod def my_function(): print(这是一个静态方法,不依赖于类或实例)

MyClass.my_function() # 直接调用

2. @classmethod装饰的函数绑定到类本身,可以通过类名或实例调用。例如:

pythonclass MyClass: def __init__(self): self.value=10

@classmethod def my_class_method(cls): print(这是一个类方法,绑定到类本身) print(cls) # 输出类本身

MyClass.my_class_method() # 通过类名调用my_instance=MyClass()my_instance.my_class_method() # 通过实例调用

总结:@staticmethod装饰的函数不依赖于类或实例,而@classmethod装饰的函数绑定到类本身。

文章来源:​​Staticmethod和classmethod的区别 - 代码领悟code05.com​​

提问:Staticmethod和classmethod的区别

用​​@staticmethod​​​修饰的函数和用​​@classmethod​​修饰的函数有什么区别?

Staticmethod与classmethod有何本质差异?

回答:

也许一些示例代码会有所帮助:注意​​foo​​​,​​class_foo​​​和​​A​​的调用签名的差异:

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)

​使用classmethods​,对象实例的类作为第一个参数隐式传递,而不是​​self​​。

a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)

您也可以使用类调用​​class_foo​​​。 事实上,如果你定义的东西是 一个classmethod,这可能是因为你打算从类而不是从类实例调用它。 ​​​A.foo(1)​​​会引发一个TypeError,但是​​A.class_foo(1)​​工作得很好:

A.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)

人们为类方法找到的一个用途是创建​​可继承的替代构造函数​​。


​使用staticmethods​,​​self​​​(对象实例)和​​cls​​(类)都不会隐式传递作为第一个参数。 它们的行为就像普通函数,除了你可以从实例或类中调用它们:

a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)

Staticmethods用于将与类具有某种逻辑连接的函数分组到类。


​​foo​​​只是一个函数,但是当你调用​​a.foo​​​时,你不只是得到函数, 您将获得函数的"部分应用"版本,对象实例​​​a​​​绑定为函数的第一个参数。 ​​foo​​​期望2个参数,而​​a.foo​​只期望1个参数。

​​a​​​绑定到​​foo​​。 这就是下面"绑定"一词的含义:

print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

使用​​a.class_foo​​​,​​a​​​不绑定到​​class_foo​​​,而是类​​A​​​绑定到​​class_foo​​。

print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>

在这里,使用staticmethod,即使它是一个方法,​​a.static_foo​​​只是返回 一个好的'ole函数,没有参数绑定。 ​​​A​​​期望1个参数,并且 ​​​a.static_foo​​也期待1个论点。

print(a.static_foo)
# <function static_foo at 0xb7d479cc>

当然,当你用类​​A​​​调用​​A​​时,也会发生同样的事情。

print(A.static_foo)
# <function static_foo at 0xb7d479cc>
标签: