2015-10-17 252 views
-3

是否可以在循环中生成变量名称?在循环中生成变量名称

的简单情况:

class product(): 
    self.shop1_name = None 
    self.shop1_price = None 
    self.shop2_name = None 
    self.shop2_price = None 
    ... 

p = product() 

# shops is a list of shops 
for i, shop in enumerate(shops[0:5]): 
    p.shop+i+1_name = shop.name # so shop1_name in first loop, shop2_name in second etc... 
    p.shop+i+1_price = shop.price 

所以有很多属性shop1_price, shop2_price...shop10_price,我想填补他们在一个循环中不要用手有写所有这些。

可能吗?

回答

3

这可能吗?

是的。您可以使用内建的setattr向对象动态添加属性。你真的想要做到这一点? Probably not。而不是:

shop1_name, shop2_name, ...为什么没有一个列表?

shop_names = [...] 

更妙的是,因为商店似乎有很多与之相关的数据(nameprice,......),你可以有一个结构化的(或非结构化)记录类型代表店然后有一个商店的名单。记录类型的例子可作为dictcollections.namedtuple一样简单,或者你可以添加一个轻量类持有的店铺数据:

class Shop(object): 
    def __init__(self, name, price): 
     self.name = name 
     self.price = price 

shops = [Shop('name1', 100), Shop('name2', 200), ...] 

现在,而不是shop1_name,你有shops[0].name(真正的ISN不会有太大的不同),你可以选择将所有商店作为集合迭代的能力。

0

使用字典或列表?

Shop = [{'name': "Nisa Local", 'price': 5000},{'name': "Tescos", 'price': 800000}] 

添加店使用:

Shop.append({'name': "Asda", 'price': 10000}) 

或只是列出:

ShopNames = ['Nisa Local', 'Tescos'] 
ShopPrices = [5000, 800000] 

,并添加使用tyhis:

ShopNames.append('Asda') 
ShopPrices.append(10000) 
0

使用数据结构像字典:

class product(): 
self.shops = [ {'name': None, 'price': None}, ... ] 
... 

p = product() 

# shops is a list of shops 
for i, shop in enumerate(shops[0:5]): 
    p.shops[i]['name'] = shop.name 
    p.shops[i]['price'] = shop.price 
+0

'shop.name'不会像Javascript那样工作。 'shop ['name']'然而。 – mgilson