关于pycharm:Python构造函数约定

Python constructors convention

我想知道Python中是否有关于构造函数的约定。如果我有一个构造函数什么都不做,我基本上可以不写它,一切都会很好。然而,当我使用Pycharm时,它建议我(警告)写一个空构造函数:

1
2
__init__:
    pass

我在PEP8中没有发现任何关于这个问题的信息。我想知道Pycharm是刚刚推出了一个新的约定,还是背后有什么原因?

谢谢。


我认为这是基于意见的,但我将分享我试图遵循的规则:1. 在构造函数中声明所有实例变量,即使它们还没有设置

1
2
3
def __init__(self, name):
    self.name = name
    self.lname = None

不要在构造函数中执行任何逻辑。当您尝试编写单元测试时,您将从中受益。

当然,如果没有必要,不要添加它。


我同意不写不必要的代码的观点。警告可能是为了帮助加速开发,因为大多数类可能都有init,这将提醒您提前编写它。

可以在设置->编辑器->检查-> Python ->"类没有__init__方法"中自定义或禁用此警告。


Class has no __init__ method

当我创建一个小的、特殊的类时,我经常看到这种情况。我用这个警告作为提示:

I forgot to derive the class from something sensible.

异常对象

例如,我将使用到raise CustomException的异常类。

没有:

1
2
class CustomException:
    pass

是的:

1
2
class CustomException(Exception):
    pass

因为Exception定义了一个__init__方法,所以这个更改使警告消失。

新样式对象

另一个例子,一个不需要任何成员变量的小类。新样式对象(在python2中显式,在python3中隐式)派生自类object

1
2
class SettClass(object)
    pass

类似地,警告也会消失,因为object有一个__init__方法。

旧式对象

或者干脆禁用警告:

1
2
3
# noinspection PyClassHasNoInit
class StubbornClass:
    pass

如果构造函数不做任何事情,就不要添加它。有些编辑喜欢警告你一些愚蠢的事情。例如,Eclipse会在变量初始化但以后不使用或类没有可序列化id时发出警告,但这是Java。如果您的程序在没有它的情况下运行,则删除构造函数。