Python:属性和setter

时间:2018-01-18 20:56:02

标签: python

我正在为库编写一些代码,但我不确定它是否有效。 我应该设置变量,如滚动,俯仰,偏航,油门。 我必须写所有财产和制定者吗? 这是最好的方式吗?

@property
def roll(self):
    return self._roll

@roll.setter
def roll(self, value):
    if(not isinstance(value, int)):
        print("You should put the integer number!")
        value = int(value)

    if value > 100:
        value = 100
    elif value < -100:
        value = -100

    self._roll = value

1 个答案:

答案 0 :(得分:1)

  

我正在为库编写一些代码,但我不确定它是否有效。我应该设置变量,如滚动,俯仰,偏航,油门。我必须写所有财产和制定者吗?这是最好的方式吗?

首先,请小心尝试过早优化代码。当有人试图优化他们的代码时,实际发生的事情往往是他们在程序中引入了不必要的错误。这并不是说您永远不会优化您的代码。当他们显然有足够的空间重新构建代码以提高效率时,请这样做。但要避免过分聪明的事情。盲目地优化&#39;事情并不明显。

总而言之,您的代码看起来很好。您完全按照应使用的property使用;在获取和设置属性期间执行额外的必要工作(通常更多设置),而不会强迫您的类的用户使用方法调用。不要过分关注自己的效率。只要你不做一些明显低效的事情,你的罚款。正如@match在评论中所说,使用property更多的是提供可维护性,稳定性和可读性,而不是效率。

但是,有几个小区域可以改进您的代码。即您的类型和边界检查。您可以将其提取到单独的方法中并在需要时调用它:

def _check_value(value):
    try:
        value = int(value)
    except ValueError as err:
        raise ValueError('only integer values are permitted') from err

    if value > 100:
        return 100
    elif value < -100:
        return -100
    return value

@property
def roll(self):
    return self._roll

@roll.setter
def roll(self, value):
    self._roll = self._check_value(value)

@property
def pitch(self):
    return self._pitch

@pitch.setter
def pitch(self, value):
    self._pitch = self._check_value(value)