Python属性在构造函数中设置值时不使用setter

Posted

技术标签:

【中文标题】Python属性在构造函数中设置值时不使用setter【英文标题】:Python property does not use setter when setting the value in the constructor 【发布时间】: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 【参考方案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吗? 是的,我也想知道。

以上是关于Python属性在构造函数中设置值时不使用setter的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 NSMuableDictionary 中设置值时应用程序崩溃

在对象中设置值时 Redux 数据不重新呈现(Immutable.js)

在codeigniter中的数据库中设置值时如何将复选框显示为选中状态

当在另一个表中找到关联值时,Oracle 在列中设置值

从对象 php 的 jquery 数组中设置值?

如何在钩子中设置值