在Python中使用单位化变量

2024-09-30 20:18:07 发布

您现在位置: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的情况下使用它,那么使用未声明变量的错误比诸如比较数字和无(或者在某些情况下甚至根本没有错误)之类的模糊错误更容易调试/回溯。在

这一切都很顺利,直到我启动pylint,当然我得到W0201:Attribute defined outsideinit几乎所有地方。我只是想知道这种编码方式是否受到反对,如果是的话,“Python式的方式”是什么。在

谢谢


Tags: 用户selfreturninitdef错误方式情况
3条回答

如果您希望通过方法设置对象的特定属性,那么在初始值设定项中始终可以使用该属性。您只需使用self._hiTemp=None,您已经通过_将其声明为私有,因此用户将理解为不依赖它。在

我的方法是将它设置为None或其他一些“自然”中不会出现的sentinel值。然后,对于需要设置它的操作,请使用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

Python不是Java,所以不要像那样编写getter和setter。你可以这样解决你的问题

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

相关问题 更多 >