【发布时间】: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 “静态方法不能修改类状态”这是大错特错