Python:属性和设置器

Python:属性和设置器,python,Python,我正在为库编写一些代码,但我不确定它是否有效。 我应该设置一些变量,比如横摇、俯仰、偏航、油门。 我是否必须编写所有属性和setter? 这是最好的方式吗 @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!")

我正在为库编写一些代码,但我不确定它是否有效。 我应该设置一些变量,比如横摇、俯仰、偏航、油门。 我是否必须编写所有属性和setter? 这是最好的方式吗

@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
@属性
def辊(自身):
返回自我
@卷装机
def辊(自身,值):
如果(不是isinstance(值,int)):
打印(“您应该输入整数!”)
value=int(值)
如果值>100:
值=100
elif值<-100:
值=-100
自滚=值
我正在为库编写一些代码,但我不确定它是否有效。我应该设置一些变量,比如横摇、俯仰、偏航、油门。我是否必须编写所有属性和setter?这是最好的方式吗

@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
首先,要小心过早地优化代码。当有人试图优化他们的代码时,实际发生的情况往往是他们在程序中引入了不必要的bug。这并不是说你永远不应该优化你的代码。当他们显然有空间重组代码以提高效率时,就这样做。但要避免过于“聪明”,盲目地“优化”那些不明显的东西

综上所述,您的代码看起来不错。您使用的是
属性
,与它应该使用的完全一样;在获取和设置属性的过程中做额外的、必要的工作(通常在设置时更是如此),而不必强迫类的用户使用方法调用。不要太在意效率。只要你不做一些明显低效的事情,你的罚款。正如@match在评论中所说,使用
属性
更多的是提供可维护性、稳定性和可读性,而不是效率

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

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)
def\u检查值(值):
尝试:
value=int(值)
除ValueError作为错误外:
raise VALUERROR(仅允许整数值)来自err
如果值>100:
返回100
elif值<-100:
返回-100
返回值
@财产
def辊(自身):
返回自我
@卷装机
def辊(自身,值):
自我检查值(值)
@财产
def变桨(自):
回程自投
@音高调节器
def变桨(自身、数值):
自投=自投检查值(值)

使用
属性
设置器
与效率关系不大,与稳定性和安全性关系更大。通过使每个访问都通过一个方法,您可以执行验证、授权等操作。调试和测试方法也更容易。同时给出了使用它们的一些很好的理由,isinstance检查将比您想象的更容易出错。在返回值之前将值转换为int会更好(而且更像python)。(
return int(value)
)@Beefster感谢您提出这个问题。不幸的是,这不一定有效,因为OP希望向用户显示自定义错误消息。然而,回顾我的代码,您确实正确地认为使用
isinstance
很容易出错。因此,我将使用一个惯用的
try/except
块。