在Python中使用未初始化变量
背景:我有一个类,用来模拟一个带有寄存器的芯片,这个芯片有很多寄存器,其中一个是内置温度传感器的高温限制。
我有以下代码:
class foo():
def __init__(self):
# does not set self._hiTemp!
...
def setHiTemp(self, t):
self._hiTemp = t
def getHiTemp(self):
return self._hiTemp
def checkHiTemp(self):
return self._temp > self._hiTemp
我之所以不在 __init__
方法里声明 self._hiTemp
,是因为用户可能不关心这个芯片的温度传感功能。用户可以以不同的方式使用这个芯片,给这个变量一个没有意义的初始值是没有必要的。不过,如果用户在没有先设置 self._hiTemp
的情况下就想使用它,使用未声明的变量会导致的错误比比较数字和 None(或者在某些情况下甚至没有错误)要容易调试和追踪。
这一切都进行得很顺利,直到我开始使用 pylint,当然我就收到了 W0201: 属性在 init 之外定义的警告。我只是想知道这种编码风格是否不被推荐,如果是的话,什么才是“Pythonic”的方式。
谢谢
5 个回答
1
如果你想通过一个方法来设置对象的某个属性,那这个属性在初始化的时候也可以设置。你可以直接用 self._hiTemp=None
来做。因为你在属性前面加了一个 _
,这表示它是私有的,所以使用这个属性的人会明白不应该依赖它。
6
Python和Java不一样,所以不要像那样写获取器和设置器。你可以这样解决你的问题
class Foo(object):
def __init__(self, hiTemp=None):
self._hiTemp = hiTemp
@property
def hiTemp(self):
if self._hiTemp is None:
raise AttributeError("You have not initialized hiTemp")
return self._hiTemp
@hiTemp.setter
def hiTemp(self, value):
self._hiTemp = value
def checkHiTemp(self):
return self._temp > self._hiTemp
foo=Foo()
foo.hiTemp = 50
print foo.hiTemp # Prints 50
foo=Foo(hiTemp=20)
print foo.hiTemp # Prints 20
foo=Foo()
print foo.hiTemp # Raises exception
12
我会把它设置为None
,或者设置成一个在正常情况下不会出现的特殊值。然后在需要使用这个值的操作中,使用assert
来快速检查,这样如果调用者不正确地使用了你的对象,就会立刻出错。
def __init__(self):
self._hiTemp = None
def checkHiTemp(self):
assert self._hiTemp is not None, 'Why you no set _hiTemp before checking it?'
return self._temp > self._hiTemp