【问题标题】:staticmethod decorator seems pointlessstaticmethod 装饰器似乎毫无意义
【发布时间】:2021-12-20 21:43:03
【问题描述】:

当我遇到以下代码时,我正在阅读 Python 中的 @staticmethod

class MyClass:
    my_var = 0

    @staticmethod
    def static_method():
        MyClass.my_var += 1

我只是不明白为什么你可以写这样的代码......这不是破坏了这个方法的目的是静态的吗?

我知道还有一个事实是第一个参数不会是类/实例引用,但是......如果我仍然可以访问类变量,那么这样调用这个装饰器仍然很奇怪,不是吗?

如果我可以访问类变量,为什么我读到的所有地方都说我不能,即使我只是清楚地使用了上面的代码?难道只是因为我做错了吗?

【问题讨论】:

  • 1.您究竟在哪里读到您无法访问类变量?它们与实例变量一样可访问,但在所有实例之间共享。 2. 我不明白这个例子如何让你相信staticmethod 装饰器是没有意义的。它所做的只是允许方法可以直接从对的引用调用,而不是从实例调用。
  • 3.这个装饰器和类变量之间没有直接的联系,它们也不是专门用来一起使用的
  • 只要有对类的引用,就可以改变类的状态。在这里,您有一个对MyClass 的硬编码引用。硬编码引用在静态方法中的事实并不相关。要点是静态方法不提供对调用类的引用作为(隐式)参数。
  • @mousetail “你不应该改变类变量” 嗯?为什么不?如果使用得当,修改类属性本质上没有任何问题
  • @VitorTamberlini “静态方法不能修改类状态”这是大错特错

标签: python python-decorators


【解决方案1】:

静态方法不能修改类状态的想法是基于静态方法不像类方法那样接收对类的引用作为参数的想法。但是,在这种情况下,对类的引用是作为硬编码值提供的。

定义静态方法而不是类方法的一个原因是保证您修改特定类的属性,而不是可能的子类。

class A:
   my_var = 0

   @classmethod
   def foo(cls):
       cls.my_var += 1

   @staticmethod
   def bar():
       A.my_var += 1


class B(A):
    my_var = 0

B.foo 的调用将修改B.my_var,而不是A.my_var。对B.bar 的调用将修改A.my_var

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2016-09-02
    • 2011-09-14
    相关资源
    最近更新 更多