Python 从对象中的属性获取随机元素

Python 从对象中的属性获取随机元素,python,object,random,attributes,Python,Object,Random,Attributes,我有一个对象,它有16个双属性,我想随机选取其中一个,所以我创建了一个方法,创建了一个0-15之间的随机数,但这个方法不是我想要的,我认为如果你们有另一个最干净的方法,这是一个非常肮脏的方法 class Currencies(object): EURToUSD = 0.0 EURToJPY = 0.0 EURToBTC = 0.0 USDToEUR = 0.0 USDToBTC = 0.0 USDToJPY = 0.0 BTCToEUR =

我有一个对象,它有16个双属性,我想随机选取其中一个,所以我创建了一个方法,创建了一个0-15之间的随机数,但这个方法不是我想要的,我认为如果你们有另一个最干净的方法,这是一个非常肮脏的方法

class Currencies(object):
    EURToUSD = 0.0
    EURToJPY = 0.0
    EURToBTC = 0.0
    USDToEUR = 0.0
    USDToBTC = 0.0
    USDToJPY = 0.0
    BTCToEUR = 0.0
    BTCToJPY = 0.0
    BTCToUSD = 0.0
    JPYToEUR = 0.0
    JPYToUSD = 0.0
    JPYToBTC = 0.0
    EURToEUR = 0.0
    JPYToJPY = 0.0
    USDToUSD = 0.0
    BTCToBTC = 0.0


    def __init__ (self):
        try:
            rates = urllib2.urlopen("http://fx.priceonomics.com/v1/rates/")
        except urllib2.URLError as e:
            return e.reasonx
        res = json.load(rates)
        self.EURToEUR = 1.000000
        self.USDToUSD = 1.000000
        self.JPYToJPY = 1.000000
        self.BTCToBTC = 1.000000
        self.EURToUSD = res['EUR_USD']
        self.EURToJPY = res['EUR_JPY']
        self.EURToBTC = res['EUR_BTC']
        self.USDToEUR = res['USD_EUR']
        self.USDToBTC = res['USD_BTC']
        self.USDToJPY = res['USD_JPY']
        self.BTCToEUR = res['BTC_EUR']
        self.BTCToJPY = res['BTC_JPY']
        self.BTCToUSD = res['BTC_USD']
        self.JPYToEUR = res['JPY_EUR']
        self.JPYToUSD = res['JPY_USD']
        self.JPYToBTC = res['JPY_BTC']

    def getRandomRate():
        randomNumber = randint(0,15)
        if(randomNumber == 1):
            return EURToUSD = 0.0
        if(...)

您可以从中选择一个随机属性,过滤与模式匹配的名称:

def getRandomRate(self):
    return random.choice([v for attr, v in vars(self).items()
                          if len(attr) == 8 and attr[3:5] == 'To'])

从所有属性中选取一个随机值,其名称为8个字符长,中间包含“代码> > 。 使用您的类的简短演示:

>>> import random
>>> c = Currencies()
>>> vars(c)
{'EURToBTC': u'0.0108027', 'BTCToJPY': u'12816.8350063', 'JPYToJPY': 1.0, 'USDToBTC': u'0.0094131', 'JPYToBTC': u'0.0000702', 'BTCToUSD': u'125.2057142', 'USDToUSD': 1.0, 'USDToJPY': u'116.1736146', 'EURToEUR': 1.0, 'JPYToUSD': u'0.0084464', 'BTCToEUR': u'92.3549138', 'USDToEUR': u'0.8820255', 'BTCToBTC': 1.0, 'JPYToEUR': u'0.0065705', 'EURToUSD': u'1.2338648', 'EURToJPY': u'126.4193644'}
>>> [v for attr, v in vars(c).items() if len(attr) == 8 and attr[3:5] == 'To']
[u'0.0108027', u'12816.8350063', 1.0, u'0.0094131', u'0.0000702', u'125.2057142', 1.0, u'116.1736146', 1.0, u'0.0084464', u'92.3549138', u'0.8820255', 1.0, u'0.0065705', u'1.2338648', u'126.4193644']
>>> random.choice([v for attr, v in vars(c).items() if len(attr) == 8 and attr[3:5] == 'To'])
u'0.0108027'

因此,列表理解为每个转换率提取了16个值,然后
random.choice()
随机选择其中一个;如果能看到一些代码就好了。但是,无论如何,你可以构建一个属性列表或元组,并将其传递给<代码>随机。Couice()/Case>。如果你能解释一下的话more@mel:
vars()
为您提供了一个属性字典;包括
'eurtour'
'eurtusd'
等。键是属性名称、值和属性值。代码选择所有这些值,然后随机选择其中一个。谢谢,但是如果len(attr)==8和attr[3:5]='To']@mel:这是在测试字符串长度(
'eurtour'
是8个字符),如果该字符串的中间2个字符是
'To'
,该怎么办。