Python PyCharm警告我为classmethod函数生成的classmethod创建一个对象

Python PyCharm警告我为classmethod函数生成的classmethod创建一个对象,python,object,pycharm,self,class-method,Python,Object,Pycharm,Self,Class Method,根据: 如果为派生类调用类方法,则派生类对象将作为隐含的第一个参数传递 所以我们可以得出结论,我们不需要使用类方法函数创建对象。但我不知道为什么PyCharm会给我这个警告,而它执行代码时却没有任何问题 代码如下: class Fruit: def sayhi(self): print("Hi, I'm a fruit") Fruit.sayhi = classmethod(Fruit.sayhi) Fruit.sayhi()enter code here 这就是警

根据:

如果为派生类调用类方法,则派生类对象将作为隐含的第一个参数传递

所以我们可以得出结论,我们不需要使用类方法函数创建对象。但我不知道为什么PyCharm会给我这个警告,而它执行代码时却没有任何问题

代码如下:

class Fruit:
    def sayhi(self):
        print("Hi, I'm a fruit")


Fruit.sayhi = classmethod(Fruit.sayhi)
Fruit.sayhi()enter code here
这就是警告

参数自空


当PyCharm给出这些警告时,它通过查看类定义来确定
sayhi
函数的工作方式。根据您的类定义,
sayhi
需要一个未填充的参数
self
。在第6行,您已经将
sayhi
重新指定为类方法,但是,就PyCharm而言,这超出了类定义,因此它是“随机应变”的领域,它不会费心根据代码的功能进行假设。如果您想让PyCharm知道
sayhi
是一个类方法,您应该在类定义中指定它。例如,使用classmethod作为装饰器

class Fruit:
    @classmethod
    def sayhi(self):
        print("Hi, im a fruit")
        
        
Fruit.sayhi()


没有警告

将classmethod函数用作装饰器,这可能有助于PyCharm了解您在做什么。还要注意,类方法的第一个参数的约定是
cls
,而不是
self
@jornsharpe;谢谢,它工作得很好,但您能告诉我为什么它不能与classmethod函数一起工作吗?我猜您刚刚发现了PyCharm在理解代码所代表的内容时所做的内省和解释的局限性。该方法最初定义为实例方法,只有在定义类后才转化为类方法;显然,这并没有更新PyCharm对类所包含内容的模型。@jonrsharpe,这是一个多么技术性的解释,谢谢:),它说“我们调用它就像调用python中没有对象的任何静态方法一样”,所以我们不需要创建对象来填充自参数!那么为什么我需要填写self呢?如上所述,PyCharm只根据类定义向您发出警告,这意味着代码缩进到
类水果:
。当发出此警告时,将根本不考虑中第6行的
classmethod
调用。您正在调用
Fruit.sayhi
,根据您给出的原始类定义,该方法需要一个名为self的参数。请记住,代码没有任何错误,只是PyCharm对代码的理解不正确,因为指定了
classmethod
调用,所以在检查时会考虑类定义。。。明白了,我相信这是正确的。类定义之外的任何事情都可以做太难的事情,或者PyGrand无法解释的事情,所以一般不会考虑。想想看,一个完全独立的文件可能正在删除、更改、替换类的方法。或者它可以根据PyCharm不可能知道结果的运行时条件更改方法