Python 构造函数约定
Python constructors convention
我想知道 Python 中是否有关于构造函数的约定。如果我有一个什么都不做的构造函数,我基本上可以不写它,一切都会正常工作。
但是,当我使用 Pycharm 时,它建议我(警告)编写一个空的构造函数:
__init__:
pass
我没有在 PEP8 中找到任何关于这个问题的信息。我想知道 Pycharm 是否只是提出了一个新约定,或者这背后是否有原因?
谢谢。
如果构造函数不执行任何操作,请不要添加它。一些编辑喜欢警告你一些愚蠢的事情。例如,Eclipse 会在变量已初始化但稍后未使用时或 类 没有可序列化 ID 时向您发出警告。但那是 Java。如果您的程序将 运行 没有它,则删除构造函数。
我认为这是基于意见的,但我会分享我尝试遵循的规则:
1. 在构造函数中声明所有实例变量,即使它们还没有设置
def __init__(self, name):
self.name = name
self.lname = None
不要在构造函数中做任何逻辑。当您尝试编写单元测试时,您将从中受益。
当然如果没有必要就不要添加。
我同意不要编写不必要的代码的观点。该警告可能有助于加快开发速度,因为大多数 类 可能都有一个 init,这会提醒您提前编写它。
可以在设置 -> 编辑器 -> 检查 -> Python -> "Class has no __init__
method"
中自定义或禁止显示此警告
当我制作一个小的临时 class 时,我一直看到这个。我使用此警告作为提示:
I forgot to derive the class from something sensible.
异常对象
例如,我会用 exception class 来 raise 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
我想知道 Python 中是否有关于构造函数的约定。如果我有一个什么都不做的构造函数,我基本上可以不写它,一切都会正常工作。 但是,当我使用 Pycharm 时,它建议我(警告)编写一个空的构造函数:
__init__:
pass
我没有在 PEP8 中找到任何关于这个问题的信息。我想知道 Pycharm 是否只是提出了一个新约定,或者这背后是否有原因?
谢谢。
如果构造函数不执行任何操作,请不要添加它。一些编辑喜欢警告你一些愚蠢的事情。例如,Eclipse 会在变量已初始化但稍后未使用时或 类 没有可序列化 ID 时向您发出警告。但那是 Java。如果您的程序将 运行 没有它,则删除构造函数。
我认为这是基于意见的,但我会分享我尝试遵循的规则: 1. 在构造函数中声明所有实例变量,即使它们还没有设置
def __init__(self, name):
self.name = name
self.lname = None
不要在构造函数中做任何逻辑。当您尝试编写单元测试时,您将从中受益。
当然如果没有必要就不要添加。
我同意不要编写不必要的代码的观点。该警告可能有助于加快开发速度,因为大多数 类 可能都有一个 init,这会提醒您提前编写它。
可以在设置 -> 编辑器 -> 检查 -> Python -> "Class has no __init__
method"
当我制作一个小的临时 class 时,我一直看到这个。我使用此警告作为提示:
I forgot to derive the class from something sensible.
异常对象
例如,我会用 exception class 来 raise 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