簡體   English   中英

屬性:init()中的調用設置程序

[英]property: call setter in init()

我有一個簡單的課程,像這樣:

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

基本上,我實例化帶有音量的TestVolume對象,該音量應始終為正浮點數。

我希望volume屬性是該類的屬性。 但是我也想在創建對象時檢查音量。 這是正確的方法嗎?

setter是(大部分情況下)唯一需要直接修改_volume方法。 只需使用__init__的屬性即可; 是否嘗試捕獲設置程序可能引發的ValueError取決於您。

def __init__(self, volume: float):
    try:
        self.volume = volume * 1000
    except ValueError:
        self.volume = 0

在這里, __init__正在執行一項策略,即在創建對象時將負音量轉換為0。 設置員的其他用戶可以自行決定在發生異常情況時該怎么做。

您的代碼是正確的,但不適用於創建新對象。 我對在__init__訪問@property的方式不熟悉。 (Python 2.7)您可以執行的是插入一個assert語句。 如果用戶輸入無效,將引發錯誤。 如果要設置默認值,可以將其包含在try.. catch塊中。

class TestVolume:

    def __init__(self, volume: float):
        assert volume > 0
        self._volume = volume * 1000
        self.volume = self._volume

您的其余代碼保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM