【问题标题】:Difference between having @staticmethod and not having it有@staticmethod 和没有它的区别
【发布时间】:2019-08-11 23:24:43
【问题描述】:

在 Python 3.x 中,我可以用 bar() 做什么而我不能用 foo() 做什么?

class A:
    def foo():
        print("some code")

    @staticmethod
    def bar():
        print("some code")

注意:我最初忘记将 self 指定为 foo() 的参数,但我将错误留在那里,因为答案已解决。

【问题讨论】:

  • foo 的定义应该是 def foo(self): 如果你打算调用它:)
  • 这是无效的。 foo 将失败,因为它需要引用 self foo(self)
  • 请不要更改问题,我已经解决了您的初始版本 - 值得留在答案中......
  • self 添加为参数后,差异显而易见。无论如何,如果没有self,该函数将永远不会运行
  • 那么我是否应该将它恢复为出现错误的原始形式并留下一个编辑说明,以便其他学习者可以接受它?

标签: python python-3.x python-decorators


【解决方案1】:

staticmethod 是一种不需要对象作为其第一个参数的方法。这意味着它是一个对类本身及其所有实例有用的方法,而不仅仅是它的实例(初始化为 A() 的对象。

这实际上意味着 Python 不会将对象本身作为参数隐式发送。一旦你调用它,你的第一个方法就会中断:

>>> a.foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() takes 0 positional arguments but 1 was given

这是因为 Python 为对象方法提供了对象本身作为第一个参数。因此,无处不在的 self 论点:

def foo(self): #Proper signature

另一方面,

A.bar()

会很好,所以会

a.bar()

对象不作为第一个参数提供。将staticmethods 用于应该对类及其实例有帮助但不需要任何知识的方法。通常我将它们用作实用函数。

注意还有第三个版本classmethod,它与常规方法相似,默认情况下它接受第一个参数 - 调用者的类。在这种情况下,最小签名是

@classmethod
def operateOnClass(cls):

使用它来进行影响所有实例的更改,例如更改类变量。

【讨论】:

  • 也许需要提一下,python有三种方法:实例方法、类方法和静态方法。
  • 是的,请详细说明,以便我得到更全面的图片
  • @将完成。每个都有一些不同的用途。
【解决方案2】:

bar() 可以从未实例化的类对象中调用。 foo() 需要作为参数提供 self,因此只能从已声明为 class A 实例的对象调用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多