我正在为库编写一些代码,但是不确定是否有效。
我应该设置诸如侧倾,俯仰,偏航,油门之类的变量。
我必须写所有财产和二传手吗?
这是最好的方法吗?

@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

最佳答案

我正在为库编写一些代码,但是不确定是否有效。我应该设置诸如侧倾,俯仰,偏航,油门之类的变量。我必须写所有财产和二传手吗?这是最好的方法吗?


首先,请谨慎尝试过早优化代码。当某人尝试优化其代码时,通常会发生的实际情况是,他们在程序中引入了不必要的错误。这并不是说您永远不要优化代码。当他们显然有空间重组代码以提高效率时,请这样做。但要避免过分“聪明”,盲目“优化”那些不明显的事情。

综上所述,您的代码看起来不错。您使用的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)

关于python - Python:属性和 setter ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48330160/

10-12 22:45