新的pycharm发行版(3.1.3社区版)建议将不能处理当前对象状态的方法转换为静态方法。
这其中的实际原因是什么?某种微性能(或内存)优化?
新的pycharm发行版(3.1.3社区版)建议将不能处理当前对象状态的方法转换为静态方法。
这其中的实际原因是什么?某种微性能(或内存)优化?
当前回答
PyCharm“认为”您可能想要一个静态方法,但您忘记将其声明为静态方法(使用@staticmethod装饰器)。
PyCharm建议这样做是因为该方法在其主体中没有使用self,因此实际上没有更改类实例。因此,该方法可以是静态的,即无需传递类实例或甚至无需创建类实例即可调用。
其他回答
Pycharm之所以将其作为警告,是因为Python在调用非静态方法(而不是add @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作为方法参数传递。
理解了这一点,你就不需要任何变通办法了。
我可以想象将类方法定义为静态方法的以下优点:
您可以只使用类名调用方法,不需要实例化它。
其余的优势如果存在的话可能是微不足道的:
可能会跑得快一点 节省一点内存
与其在特定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()
PyCharm“认为”您可能想要一个静态方法,但您忘记将其声明为静态方法(使用@staticmethod装饰器)。
PyCharm建议这样做是因为该方法在其主体中没有使用self,因此实际上没有更改类实例。因此,该方法可以是静态的,即无需传递类实例或甚至无需创建类实例即可调用。
这个错误消息帮助了我很多,因为我没有意识到我不小心使用测试示例播放器编写了函数
my_player.attributes[item]
而不是正确的方式
self.attributes[item]