gpt4 book ai didi

python - 以正确的方式在 setter 和构造函数中重用验证逻辑

转载 作者:太空宇宙 更新时间:2023-11-04 05:57:13 26 4
gpt4 key购买 nike

我有一个类,该类的属性带有自定义 setter 来执行验证。我也希望能够将属性作为构造函数参数传递,并从构造函数中调用 setter 以重用验证逻辑:

class Part(object):
def __init__(self, pn):
# self._pn = None
self.pn = pn

@property
def pn(self):
return self._pn

@pn.setter
def pn(self, value):
if type(value) != str:
raise Exception("Part number must be a string")
self._pn = value # warning here

在最后一行,PyCharm 发出警告:

Instance attribute _pn defined outside __init__ 

如果我在构造函数中取消注释 self._pn = None 那么警告就会消失,但我不喜欢它,因为它是毫无意义的代码:如果引发异常,无论如何都不会创建对象,那么设置初始值有什么意义呢?

这是 PyCharm/工具的缺点,还是我做错了?有没有更好的方法以 DRY 方式实现相同的目标,没有警告,没有毫无意义的代码?

最佳答案

PyCharm 在这里没有错。该警告告诉您您正在运行时在对象上创建一个变量。

此警告的目的是提醒您您可能拼错了变量名,因为在编写 Python 时可能会发生这种情况。

我实际上认为您编写此类的方式确实不是编写 python 的正确方式,因为 EXPLICIT 比 IMPLICIT 更好(在本地 python 解释器中键入“import zen”)。

请记住,以 _ 开头的变量表示“仅当您知道自己在做什么时才使用。”

关于python - 以正确的方式在 setter 和构造函数中重用验证逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27074942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com