Python 属性:init()中的调用设置器
我有这样一个简单的类:Python 属性:init()中的调用设置器,python,Python,我有这样一个简单的类: class TestVolume: def __init__(self, volume: float): self._volume = volume * 1000 self.volume = self._volume @property def volume(self): return self._volume / 1000 @volume.setter def volum
class TestVolume:
def __init__(self, volume: float):
self._volume = volume * 1000
self.volume = self._volume
@property
def volume(self):
return self._volume / 1000
@volume.setter
def volume(self, value):
if value <= 0:
raise ValueError("Volume must be > 0")
self._volume = value
类测试卷:
def _u初始(自身,体积:浮动):
自身容量=容量*1000
self.volume=self.\u volume
@财产
def体积(自身):
返回自我。\u体积/1000
@音量调节器
def体积(自身,数值):
如果值,则setter是(大多数情况下)唯一需要直接修改\u volume
的方法。只需使用\uuuu init\uuuu
中的属性即可;您是否尝试捕捉setter可能引发的ValueError
,取决于您
def __init__(self, volume: float):
try:
self.volume = volume * 1000
except ValueError:
self.volume = 0
这里,\uuuuu init\uuuuu
在创建对象时执行将负卷转换为0的策略;setter的其他用户可以自行决定在发生异常时应做什么。setter是(在大多数情况下)唯一需要直接修改的方法。只需使用\uuuu init\uuuu
中的属性即可;您是否尝试捕捉setter可能引发的ValueError
,取决于您
def __init__(self, volume: float):
try:
self.volume = volume * 1000
except ValueError:
self.volume = 0
这里,\uuuuu init\uuuuu
在创建对象时执行将负卷转换为0的策略;setter的其他用户可以自行决定在发生异常时应做什么。您的代码是正确的,但它不适用于创建新对象。我不熟悉在\uuuu init\uuuu
访问@property的方法。(Python2.7)您可以做的是插入一条断言语句。如果用户输入无效,它将抛出错误。您可以在try.中嵌入此内容。。如果要设置默认值,请单击catch
block
class TestVolume:
def __init__(self, volume: float):
assert volume > 0
self._volume = volume * 1000
self.volume = self._volume
代码的其余部分保持不变。您的代码是正确的,但不适用于创建新对象。我不熟悉在\uuuu init\uuuu
访问@property的方法。(Python2.7)您可以做的是插入一条断言语句。如果用户输入无效,它将抛出错误。您可以在try.中嵌入此内容。。如果要设置默认值,请单击catch
block
class TestVolume:
def __init__(self, volume: float):
assert volume > 0
self._volume = volume * 1000
self.volume = self._volume
剩下的代码保持不变。为什么不在init
函数中检查它呢?没有特别的原因。我刚刚发现了财产。为了避免重复我自己的想法?为什么不在init
函数中检查它呢?没有特别的原因。我刚刚发现了财产。也许是为了避免重复我自己?我不太明白。我应该在init
中只做self.volume=volume*1000
,其他什么都不做,对吗?对;分配给self.volume
内部\uuuu init\uuuu
会触发sett,就像其他分配给属性一样。我不确定是否理解。我应该在init
中只做self.volume=volume*1000
,其他什么都不做,对吗?对;分配给self.volume
内部\uuuu init\uuuu
会触发sett,就像其他分配给属性一样。