当前位置: 首页 > 知识库问答 >
问题:

为什么PyCharm提议将方法更改为静态?

宋勇
2023-03-14

新的py魅力版本(3.1.3社区版)建议将不适用于当前对象状态的方法转换为静态。

实际原因是什么?某种微性能(或内存)优化?

共有3个答案

邵研
2023-03-14

我认为发出此警告的原因是Py魅力中的配置。您可以取消选中选择方法在编辑器中可能是静态的-

乌和畅
2023-03-14

与@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ärson]

# noinspection PyMethodMayBeStatic
def bar(self):
    doing_something_without_self()

我为此使用的应用程序(我无法使用@staticmethod的原因)是创建一个处理程序函数表,用于响应协议子类型字段。所有处理程序都必须是相同的形式(静态或非静态)。但有些人碰巧没有对该实例做任何处理。如果我将这些设置为静态,我会得到“TypeError:‘staticmethod’对象不可调用”。

为了支持OP的惊愕,建议您尽可能地添加staticmethod,这违背了这样一个原则,即以后减少代码的限制比增加代码的限制更容易——现在减少方法的限制,因为您可以调用类。f()而不是实例。f()。

关于为什么存在此警告的猜测:

  • 它宣传staticmethod。它让开发人员意识到他们可能想要的东西
公良天逸
2023-03-14

PyCharm“认为”您可能想要一个静态方法,但您忘记将其声明为静态的(使用staticmethod修饰符)。

PyCharm提出这一点是因为该方法在其主体中不使用self,因此实际上不会更改类实例。因此,该方法可以是静态的,即无需传递类实例,甚至无需创建类实例即可调用。

 类似资料:
  • 问题内容: 我正在为某门课程的一些代码编写解释,并且偶然使用了这些单词并且可以互换使用。我决定回过头来修正措辞,但在我的理解上遇到了一个漏洞。 据我了解,子例程是一个如果它不作用于一个类的实例(其作用仅限于其显式输入/输出),并且是一个如果它作用于一个类的实例(它可能带有消除导致实例不纯的副作用)。 这里有一个很好的讨论主题。请注意,根据接受的答案的定义,静态实际上应该是一个函数,因为永远不会隐式

  • 根据我的理解,如果子例程不作用于类的实例(其作用仅限于显式输入/输出),则它是;如果子例程作用于类的实例,则它是(它可能会对实例产生副作用,使其不纯)。 关于这个话题,这里有一个很好的讨论。请注意,根据接受答案的定义,静态实际上应该是一个函数,因为实例从不隐式传递,而且它不能访问任何实例的成员。 不过,考虑到这一点,静态实际上不应该是函数吗? 我想确保我使用了正确的措辞。 有人能澄清一下吗?

  • 问题内容: 如果该方法可以声明为静态方法,则会向编译器发出警告。 [edit] Eclipse帮助中的确切引号,重点是私有和最终的: 启用后,编译器将为私有或最终方法(仅引用静态成员)发出错误或警告。 是的,我知道我可以将其关闭,但是我想知道打开它的原因吗? 为什么将每个方法都声明为静态是一件好事? 这会给性能带来任何好处吗?(在移动域中) 指出一种方法是静态的,我想表明您不使用任何实例变量,因此

  • 我正在研究Cooja模拟器。我创建了一个包含一些天空尘埃的网络。默认情况下,CSMA用作motes的mac层,但我想将其更改为TDMA。TDMA MAC层作为TDMA\U MAC存在于Contiki 2.6中,但在较新版本的Contiki中已删除。如何解决这个问题?

  • 问题内容: 我很困惑为什么不允许以下内容: 我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的? 我希望所有类都可以实现该方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法… **_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。 问题答案: 在Java中调用静态方法要

  • 我最近在Eclipse中查看了我的警告,发现了这样一个警告: 如果方法可以声明为静态,它将给出编译器警告。 [编辑]Eclipse帮助中的确切引用,强调私有和最终: 如果启用,编译器将为私有或最终的方法以及仅引用静态成员的方法发出错误或警告。 是的。我知道我可以关掉它,但我想知道打开它的原因? 为什么将所有可能的方法声明为静态方法是一件好事呢? 这会给性能带来什么好处吗?(在移动域中) 指出一个方