Python 构造函数约定

Python constructors convention

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

__init__:
    pass

我没有在 PEP8 中找到任何关于这个问题的信息。我想知道 Pycharm 是否只是提出了一个新约定,或者这背后是否有原因?

谢谢。

如果构造函数不执行任何操作,请不要添加它。一些编辑喜欢警告你一些愚蠢的事情。例如,Eclipse 会在变量已初始化但稍后未使用时或 类 没有可序列化 ID 时向您发出警告。但那是 Java。如果您的程序将 运行 没有它,则删除构造函数。

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

def __init__(self, name):
    self.name = name
    self.lname = None
  1. 不要在构造函数中做任何逻辑。当您尝试编写单元测试时,您将从中受益。

  2. 当然如果没有必要就不要添加。

我同意不要编写不必要的代码的观点。该警告可能有助于加快开发速度,因为大多数 类 可能都有一个 init,这会提醒您提前编写它。

可以在设置 -> 编辑器 -> 检查 -> Python -> "Class has no __init__ method"

中自定义或禁止显示此警告

当我制作一个小的临时 class 时,我一直看到这个。我使用此警告作为提示:

I forgot to derive the class from something sensible.

异常对象

例如,我会用 exception classraise CustomException

否:

class CustomException:
    pass

是:

class CustomException(Exception):
    pass

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

新样式对象

另一个例子,一个不需要任何成员变量的小 class。 new style object(在 Python 2 中显式,在 Python 3 中隐式)派生自 class object.

class SettClass(object)
    pass

同样,警告消失了,因为 object 有一个 __init__ 方法。

旧样式对象

或者只是禁用警告:

# noinspection PyClassHasNoInit
class StubbornClass:
    pass