【问题标题】:AttributeError query属性错误查询
【发布时间】: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): 检查以确保 valorstr
  • 自己设置valor = int(50),再用它设置self._preco = valor的值!为什么你会惊讶于它的价值是你设定的?
  • 现在是学习how to debug small programsto 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


【解决方案1】:

好吧,我做一个调试。 在:

self.preco = self.preco - (self.preco*(percentual/100))

发生一个循环,他做了一个操作,但在此之后他返回设置器并再次更改值,为了解决这个问题,我将其更改为:

self._preco = self.preco - (self.preco*(percentual/100))

在第一次尝试中,也会发生循环,但是

if isinstance(valor,str):

只更改一次值。

这解决了这两个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多