【发布时间】:2014-06-26 14:50:55
【问题描述】:
新的pycharm 版本(3.1.3 社区版)提出将不能处理当前对象状态的方法转换为静态。
这样做的实际原因是什么?某种微性能(或内存)优化?
【问题讨论】:
-
@Wooble:有
return 1作为该方法的单行实现。 “更多”不包含任何有用的内容
新的pycharm 版本(3.1.3 社区版)提出将不能处理当前对象状态的方法转换为静态。
这样做的实际原因是什么?某种微性能(或内存)优化?
【问题讨论】:
return 1 作为该方法的单行实现。 “更多”不包含任何有用的内容
我可以想象将类方法定义为静态方法的以下优点:
如果存在的话,剩余的优势可能是微不足道的:
【讨论】:
bit 运行得更快并不是重点(因为它们在 ram 中运行,所以在这两种情况下都很快),而且您知道计算机现在有 bunch 的内存,所以这不再是问题了。另请注意您的第一个想法:这是一种程序行为,而不是面向对象的行为。
PyCharm“认为”您可能想要拥有一个静态方法,但您忘记将其声明为静态(使用@staticmethod 装饰器)。
PyCharm 提出这一点是因为该方法在其主体中没有使用self,因此实际上并没有更改类实例。因此,该方法可以是静态的,即无需传递类实例或什至无需创建类实例即可调用。
【讨论】:
NotImplementedError 似乎总是一个好主意。
self 的值。在这种情况下,警告是可以忽略的,我用# noinspection PyMethodMayBeStatic 标记它。遗憾的是,IntelliJ IDEA 不提供在此警告的上下文菜单中添加此禁用注释。
这个错误消息对我有很大帮助,因为我没有意识到我不小心使用我的测试示例播放器编写了我的函数
my_player.attributes[item]
而不是正确的方式
self.attributes[item]
【讨论】:
由于您没有在 bar 方法主体中引用 self,PyCharm 会询问您是否可能想要将 bar 设为静态。在其他编程语言(如 Java)中,声明静态方法的原因很明显。在 Python 中,静态方法 (AFIK) 的唯一真正好处是能够在没有类实例的情况下调用它。但是,如果这是您唯一的原因,那么您最好使用顶级函数 - 如注释 here。
简而言之,我不能百分百确定它为什么会出现。我猜他们可能会在即将发布的版本中删除它。
【讨论】:
同意@jolvi、@ArundasR 和其他人,警告发生在不使用self 的成员函数上。
如果您确定 PyCharm 是错误的,该函数不应该是 @staticmethod,并且如果您重视零警告,您可以通过两种不同的方式消除此警告:
解决方法 #1
def bar(self):
self.is_not_used()
doing_something_without_self()
def is_not_used(self):
pass
解决方法 #2 [感谢@DavidPärsson]
# noinspection PyMethodMayBeStatic
def bar(self):
doing_something_without_self()
为此我的应用程序(我不能使用@staticmethod 的原因)是制作一个处理函数表以响应协议子类型字段。当然,所有处理程序必须是相同的形式(静态或非静态)。但有些人碰巧没有对实例做任何事情。如果我将这些设为静态,我会得到“TypeError: 'staticmethod' object is not callable”。
为了支持 OP 的惊愕,建议您尽可能添加 staticmethod,这与 principle 背道而驰,因为您可以调用 class.f() 而不是 instance.f()。
猜测为什么会出现这个警告:
【讨论】:
# noinspection PyMethodMayBeStatic 会抑制警告,在我看来比调用空方法更好。
self 在 Python3 中根本没有被删除。
self 在 Python 3 中不需要的任何方式。你能举个例子或链接吗?
我同意这里给出的答案(方法不使用self,因此可以用@staticmethod 装饰)。
我想补充一点,您可能希望将该方法移动到顶级函数,而不是类中的静态方法。有关详细信息,请参阅此问题和接受的答案:python - should I use static methods or top-level functions
将方法移动到顶级函数也将修复 PyCharm 警告。
【讨论】:
self 不是参数,pycharm 将创建一个顶级函数而不是静态方法。
self,因此可能是顶级的,但是,在查看此方法的作用时,这并不合乎逻辑-因为顶级它看起来更像是一种全局方法,虽然它实际上是从该类创建的实例的一个小帮助方法。所以为了让我的代码在逻辑上井井有条,装饰器是完美的解决方案。
我认为这个警告的原因是 Pycharm 中的配置。 您可以在 Editor->Inspection
中取消选中 Method may be static【讨论】:
这可能有点混乱,但有时您只是不需要访问self,但您更愿意将方法保留在类中并且不使其成为静态的。或者你只是想避免添加一堆难看的装饰器。以下是针对这种情况的一些潜在解决方法。
如果你的方法只有副作用,而你并不关心它返回什么:
def bar(self):
doing_something_without_self()
return self
如果确实需要返回值:
def bar(self):
result = doing_something_without_self()
if self:
return result
现在你的方法使用self,警告消失了!
【讨论】:
Pycharm 之所以将其作为警告,是因为 Python 在调用非静态方法(不添加 @staticmethod)时会将 self 作为第一个参数传递。 Pycharm 知道。
例子:
class T:
def test():
print "i am a normal method!"
t = T()
t.test()
output:
Traceback (most recent call last):
File "F:/Workspace/test_script/test.py", line 28, in <module>
T().test()
TypeError: test() takes no arguments (1 given)
我来自Java,在Java中“self”被称为“this”,你不需要在类方法中写self(或this)作为参数。您可以在方法中根据需要调用 self 。但是 Python“必须”将 self 作为方法参数传递。
通过了解这一点,您不需要任何解决方法作为@BobStein 的答案。
【讨论】:
self 那又怎样?
与其在特定 IDE 中实施另一种方法来解决此错误,不如执行以下操作有意义? PyCharm 不建议使用此实现。
class Animal:
def __init__(self):
print("Animal created")
def eat(self):
not self # <-- This line here
print("I am eating")
my_animal = Animal()
【讨论】: