Я пытаюсь получить доступ к переменной экземпляра self.code в классе Line в классе Quote. Я пытаюсь сделать следующее правило: когда делается цитата, содержащая строку "door_sign" и "escape_sign", они получают 10% от всей цитаты.
Вот код.
class Client:
def __init__(self, postcode):
self.postcode = postcode
class Line:
def __init__(self, code, unit_cost, quantity=1):
self.code = code
self.unit_cost = unit_cost
self.quantity = quantity
def cost(self):
if self.code == 'door_sign' and self.quantity >=3:
return self.unit_cost * self.quantity * 0.8
else:
return self.unit_cost * self.quantity
class Quote:
def __init__(self, client=None, lines=[]):
self.client = client
self.lines = lines
def cost(self):
**** Вот где моя проблема ****
for l in self.lines:
if line.code == 'door_sign' and 'escape_sign':
return sum([l.cost() * 0.9])
else:
return sum([l.cost()])
print('Rule')
assert Quote(client=Client(postcode=3000), lines=[
Line(code='escape_sign', unit_cost=20.0, quantity=10),
]).cost() == 200.0
assert Quote(client=Client(postcode=3000), lines=[
Line(code='door_sign', unit_cost=10.0, quantity=1),
Line(code='escape_sign', unit_cost=20.0, quantity=10),
]).cost() == 189.0
Похоже, вы всегда escape_sign
скидку, так как escape_sign
всегда True
и неправильно вычисляет стоимость, возвращаясь раньше. Почему бы вам не попробовать это в методе def cost
:
def cost(self):
needed = {'door_sign', 'escape_sign'}
discount = {l.code for l in self.lines} & needed == needed
cost = sum(l.cost() for l in self.lines)
return (cost * 0.9) if discount else cost
Быстрое редактирование, я пропустил, что вы хотите скидку, если оба escape_sign
и door_sign
находятся в порядке.
Если вы хотите в одном цикле:
def cost(self):
door = False
escape = False
cost = 0
for line in self.lines:
if line.code == 'escape_sign':
escape = True
elif line.code == 'door_sign':
door = True
cost += line.cost()
return (cost * 0.9) if (escape and door) else cost
class Quote:
def __init__(self, client=None, lines=[]):
self.client = client
self.lines = lines
def cost(self):
codes={l.code for l in self.lines}
price_modifier = 0.9 if codes.issuperset({'door_sign','escape_sign'}) else 1.0
return sum([l.cost()*price_modifier for l in self.lines])