新的pycharm版本(3.1.3社区版)建议将不适用于当前对象状态的方法转换为静态方法。
实际的原因是什么?某种微性能(或内存)优化?
return 1
一个方法的单行实现。“更多”不包含任何有用内容
新的pycharm版本(3.1.3社区版)建议将不适用于当前对象状态的方法转换为静态方法。
实际的原因是什么?某种微性能(或内存)优化?
return 1
一个方法的单行实现。“更多”不包含任何有用内容
Answers:
PyCharm认为您可能想拥有一个静态方法,但是却忘记声明它是静态的(使用@staticmethod
装饰器)。
PyCharm提出这一点是因为该方法未在其主体中使用 self
,因此实际上并未更改类实例。因此,该方法可以是静态的,即可以在不传递类实例的情况下甚至在没有创建类实例的情况下调用。
NotImplementedError
。
self
。在这种情况下,警告可以忽略,我用标记# noinspection PyMethodMayBeStatic
。IntelliJ IDEA不提供在此警告的上下文菜单中添加此禁用注释的想法,这很可惜。
同意@ 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'对象不可调用”。
为了支持OP的复杂性,建议您在可能的情况下随时添加staticmethod ,这与后来使代码的限制性降低而不是使其变得更加限制性的原理背道而驰-使方法变为静态使其现在的约束性降低,因为您可以调用class.f()而不是instance.f()。
猜测为何存在此警告:
# noinspection PyMethodMayBeStatic
在方法或类之上添加可抑制警告,并且在我看来比调用空方法更好。
self
完全没有在Python3中删除。
我同意此处给出的答案(该方法未使用self
,因此可以用修饰@staticmethod
)。
我想补充一点,您可能想将方法移至顶级函数,而不是将类中的静态方法移至该函数。有关详细信息,请参见此问题和可接受的答案:python-我应该使用静态方法还是顶层函数
将方法移至顶层函数也将修复PyCharm警告。
self
不是参数的话)。
self
因此可能是顶层的,但是,在查看此方法的作用时,这并不合逻辑-作为顶层,它看起来更像是全局方法,对于从该类创建的实例,实际上是一个小的辅助方法。因此,为了使我的代码合理地组织起来,装饰器是完美的解决方案。
我可以想象将类方法定义为静态方法的以下优点:
如果存在的话,其余的优势可能是微不足道的:
bit
运行速度不是重点(因为它们在ram中都运行,所以在两种情况下都运行得很快),并且您知道计算机现在具有bunch
内存,所以这不再是问题。还要注意您的第一个想法:这是一种过程行为,而不是面向对象的行为。
Pycharm之所以作为警告,是因为Python在调用none静态方法(不添加@staticmethod)时会将self作为第一个参数传递。皮查姆知道这一点。
例:
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
怎么办?
self
在方法内的任何地方引用了吗?(如果问题确实是“为什么PyCharm的设计师为什么要这样设计……您必须要问他们,而不是这样……)