【发布时间】:2021-07-15 02:33:45
【问题描述】:
我的代码:
class Produto:
def __init__(self,nome,preco):
self.nome = nome
self.preco = preco
def desconto(self,percentual):
self.preco = self.preco - (self.preco*(percentual/100))
@property
def preco(self):
return self._preco
@preco.setter
def preco(self,valor):
if isinstance(valor,str):
valor = float(valor.replace('R$',''))
self._preco = valor
p1 = Produto('camisa', 'R$50')
p1.desconto(20)
print(p1.preco)
返回:
40
此代码 100% 工作,但是,如果我更改这部分:
@preco.setter
def preco(self,valor):
if isinstance(valor,str):
valor = float(valor.replace('R$',''))
self._preco = valor
为:
@preco.setter
def preco(self,valor):
valor = float(valor.replace('R$',''))
self._preco = valor
我有这个错误:
AttributeError: 'float' 对象没有属性 'replace'
为什么?
另一个错误: 如果我将相同的部分更改为:
@preco.setter
def preco(self,valor):
valor = int(50)
self._preco = valor
p1 = Produto('camisa', 'R$50')
p1.desconto(10)
print(p1.preco)
他回来了
50
他为什么不返回 45?
【问题讨论】:
-
您的错误与属性、getter 或 setter 无关。你得到
AttributeError因为float对象没有成员函数replace()-- 另一方面,str对象有。if isinstance(valor, str):检查以确保valor是str。 -
你自己设置
valor = int(50),再用它设置self._preco = valor的值!为什么你会惊讶于它的价值是你设定的? -
现在是学习how to debug small programs 和to use a debugger 的好时机,逐步检查您的代码并观察每一行代码的作用。通过将这些中间结果与预期结果进行比较,确定您的程序与您的预期有何不同。从那里向后工作以缩小问题的原因。
-
所以在使用“replace”之前我必须检查它是否是'str'?
-
好吧,我成功了,并且:
self.preco = self.preco - (self.preco*(percentual/100))-> 之后,再次调用@preco.setter。为了解决,我更改为:self._preco = self.preco - (self.preco*(percentual/100))。如果他有相同的名字,就会发生一个循环。
标签: python properties getter setter