2017-02-23 110 views
0

我最近开始使用PyCharm,它告诉我什么时候我的一个方法可以是静态的(每当我不使用任何成员时)。Python静态或不静态

我想知道是否是一个很好的做法,只要我可以或不可以使方法变为静态。我知道在其他(编译)语言中这是一个坏习惯,但它认为对于Python来说它实际上会更轻。通常,PyCharm提出的这些修正是由PEP编号支持的,但这个修改没有。

TL; DR 即使我不需要静态使用它们,我是否应该将静态方法声明为静态方法?

+2

我建议专注于概念模型而不是代码做出这个决定。操作在概念上是针对单个对象实例的(即使不需要像当前实现的那样与该实例进行交互),或者与您正在使用的类表示的对象类型通用的操作。或者,该操作是否可用于可能无法访问课程实例的代码?从PyCharm处理此消息是为了提醒您思考您的概念模型,而不是提供具体结果的建议。 –

+0

这似乎是一个偏好问题。至少对于我来说。 – Dschoni

+1

......顺便说一句,“在其他(编译)语言中的坏习惯”是...我不同意的是绝对是真的。 –

回答

0

如果一个方法,一个类的函数属性不能使用第一个参数,一个类的实例,就可以声明为static。用一个未使用的参数定义一个函数/ bug通常是一个坏主意。如果缺乏使用是一个错误,因为应该使用参数,那么应该修复它。如果缺乏使用不是一个bug,那么(一般来说),参数应该从标题中删除。

如果不使用不是bug,PyCharm应该建议如何从类中移除该函数,并从定义中移除未使用的self参数,以便可以在不需要不相关的类实例的情况下调用该函数。 Python不是Java。 Python使用模块而不是类作为默认的函数容器。例如:

def C: 
    def fmeth(self, x): 

def ffunc(x): 
    return x * 3 + 2 

print(C().fmeth(0), ffunc(0) 

除了在一些特殊情况下,没有被要求的功能通过C实例来访问获得。

Python stdlib几乎不使用staticmethod()。除了测试以外,只有大约20次使用,我检查过的可以看作是特殊情况。 Guido van Rossum曾表示,staticmethod以及classmethod的增加值得怀疑,因此不应该使用太多。

+0

很好,谢谢。模块中我没有足够的思考。我只是将它移到课程外面,然后避免导入它。 – lagagne