Вызов переменной экземпляра в другом классе

1

Я пытаюсь получить доступ к переменной экземпляра 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
Теги:
class
conditional
instance-variables

2 ответа

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
  • 0
    Спасибо за ваш ответ! Цикл возвращает только стоимость первой строки цитаты и игнорирует вторую строку.
  • 0
    Не смотря на то, что это была моя вина, я не сделал правильный отступ! Еще раз спасибо!
0
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])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню