Как бы вы упростили calculate_commission(), если бы процент комиссии для каждого атрибута определялся сжатым списком, а длина сжатого списка потенциально могла бы увеличиться (например, ...('price_201', 2.3),)?

zipped_price_and_commission = [
    ('price_4', .04),
    ('price_3', .034),
    ('price_2', .029),
    ('price_1', .021),
]

class Price:
    def __init__(self, **kwargs):
        self.price = kwargs.get('price')
        self.price_1 = 2
        self.price_2 = 2.5
        self.price_3 = 3
        self.price_4 = 5

    def calculate_commission(self):
        if self.price >= self.price_4:
            commission = .04
        elif self.price >= self.price_3:
            commission = .034
        elif self.price >= self.price_2:
            commission = .029
        elif self.price >= self.price_1:
            commission = .021
        else:
            commission = 0

        setattr(self, 'commission', commission)

 IN: price = Price(price=3.3)
 IN: price.calculate_commission()
 IN: print(price.commission)
OUT: 0.034
0
bdoubleu 27 Июн 2019 в 20:43

3 ответа

Лучший ответ

Во-первых, вы должны определить все атрибуты в функции init . Например, вы получите сообщение об ошибке, если кто-то попытается получить доступ к атрибуту комиссии без предварительной проверки. Так что, чтобы быть уверенным, вы должны что-то инициализировать.

Предполагая, что нет необходимости иметь комиссию в виде сжатого списка, вы можете просто сделать это так:

comission = [ 0.04, 0.034, 0.029, 0.021]
class Price:
    def __init__(self, cost):
        self.price = cost 

        self.prices = [5,3,2.5,2]
        self.commission = 0 
    def calculate_commission(self):

        for index, prc in enumerate(self.prices):
            if self.price >= prc:
                self.commission = comission[index]
                break 
price = Price()
price.calculate_commission()
print(price.commission)

Однако, если вам нужен сжатый список, вы можете изменить строку self.comission на

      self.commission = zipped_price_and_commission[index][1]

Изменить: после просмотра вашего обновления: Если количество комиссий увеличивается, вам просто нужно обновить переменную self.prices, чтобы отразить их. Вы должны также передать цены в качестве аргумента классу, а не устанавливать его внутри класса

1
Kamuish 27 Июн 2019 в 17:55

Вы можете использовать словарь:


commissions = {
    'price_4': .04,
    'price_3': .034,
    'price_2': .029,
    'price_1': .021}

Затем в calculate_commission():

    def calculate_commission(self):
        if self.price >= self.price_4:
            commission = commissions['price_4']
        elif self.price >= self.price_3:
            commission = commissions['price_3']
        elif self.price >= self.price_2:
            commission = commissions['price_2']
        elif self.price >= self.price_1:
            commission = commissions['price_1']
        else:
            commission = 0

        setattr(self, 'commission', commission)
1
Michael Bianconi 27 Июн 2019 в 17:51
zipped_price_and_commission = [
('price_4', .04),
('price_3', .034),
('price_2', .029),
('price_1', .021),

]

class Price:

    def __init__(self, **kwargs):
        self.price = kwargs.get('price')
        self.price_1 = 2
        self.price_2 = 2.5
        self.price_3 = 3
        self.price_4 = 5
        self.priceData = { 'price_4': 5,'price_3': 3,'price_2': 2.5,'price_1': 2}

    def calculate_commission(self):
        commission = 0
        for price , commision in zipped_price_and_commission:
            if self.price >= self.priceData[price]:
                commission = commision
                break
        setattr(self, 'commission', commission)

price = Price(price=3.3)

price.calculate_commission()

print(price.commission)
0
Asif 27 Июн 2019 в 18:20