Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 属性:init()中的调用设置器_Python - Fatal编程技术网

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,就像其他分配给属性一样。