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)