【问题标题】:Python property does not use setter when setting the value in the constructorPython属性在构造函数中设置值时不使用setter
【发布时间】:2016-03-11 09:01:23
【问题描述】:

我有一个带有构造函数和几个属性的类

class Foo(object):
    def __init__(self, value1):
        self._value1 = value1

    @property
    def value1(self):
        return self._value1

    @property.setter
    def value1(self, value):
         assert value == 1
         self._value1 = value

现在,当我在创建对象时设置 value1 时,不使用 setter。我注意到了这一点,因为在输入错误值时没有调用断言。

如何让构造函数中设置的值使用setter?

【问题讨论】:

  • 您没有使用__init__ 中的属性。所以不,Python 怎么知道将 setter 用于value1

标签: python properties constructor


【解决方案1】:

您通过设置底层变量而不是使用属性来显式绕过 setter。去掉下划线。

def __init__(self, value1):
    self.value1 = value1

【讨论】:

    【解决方案2】:

    解决方案?

    class Foo(object):
        def __init__(self, value1 = 0):
            self.value1 = value1    # Calling Set Property
    
        @property
        def value1(self):
            return self.__value1
    
        @property.setter
        def value1(self, value):
             assert value == 1
             self.__value1 = value
    

    其他例子...

    示例 1

    class Product(object):
        
        def __init__(self, price = 0.0):
            self.price = price
        
        def get_price(self):
            return self.__price
        
        def set_price(self, value):
            if value < 0:
                raise ValueError("Price cannot be negative")
            self.__price = value
        
        price = property(get_price, set_price)
    

    示例 2

    class Product(object):
    
        def __init__(self, price = 0.0, name = ""):
            self.price = price
            self.name = name
        
        # property for __price attribute 
        @property
        def price(self):
            return self.__price
    
        @price.setter
        def price(self, value):
            if value < 0:
                raise ValueError("Price cannot be negative")
            self.__price = value
    
        # property for __name attribute 
        @property
        def name(self):
            return self.__name
    
        @name.setter
        def name(self, value):
            for ch in value:
                if ch.isdigit():
                    raise Exception("Enter valid product name")
            self.__name = value
    

    PythonDevelopment #MachineLearning #ComputerVision #NLP #DataScience #DeepLearning #NeuralNetworks #IoT #WebDevelopment #WebScraping

    【讨论】:

    • 参数真的需要使用dunders吗?
    • 是的,我也想知道。
    猜你喜欢
    • 2019-03-27
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多