根据压缩属性,值对设置对象属性

时间:2019-06-27 17:43:52

标签: python

如果每个属性的佣金百分比由压缩列表定义,并且压缩列表的长度有可能增加(例如CKRecord.References),您将如何简化class Field: coordinates = {} def __init__(self, x_arg, y_arg, z_arg = None): self.coordinates['x'] = x_arg self.coordinates['y'] = y_arg if z_arg is not None: self.coordinates['z'] = z_arg else: self.coordinates['z'] = 0 def update_location(self, x_arg, y_arg, z_arg = None): del self.coordinates['x'] del self.coordinates['y'] self.coordinates['x'] = x_arg self.coordinates['y'] = y_arg if z_arg is not None: del self.coordinates['z'] self.coordinates['z'] = z_arg def __repr__(self): return "[" + str(self.coordinates['x']) + ", " + str(self.coordinates['y']) + ", " + str(self.coordinates['z']) + "]" def __str__(self): return "[" + str(self.coordinates['x']) + ", " + str(self.coordinates['y']) + ", " + str(self.coordinates['z']) + "]" map = [[[Field(current_x, current_y, current_z) for current_z in xrange(3)] for current_y in xrange(10)] for current_x in xrange(10)]

calculate_commission()

3 个答案:

答案 0 :(得分:1)

您可以使用字典:


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 :(得分:1)

首先,您应该在 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变量以反映它们。您还应该将价格作为参数传递给该类,而不是将其设置在该类内部

答案 2 :(得分:0)

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)