在Python中使用未初始化变量

5 投票
5 回答
2663 浏览
提问于 2025-04-16 23:15

背景:我有一个类,用来模拟一个带有寄存器的芯片,这个芯片有很多寄存器,其中一个是内置温度传感器的高温限制。

我有以下代码:

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

撰写回答