Python - 动态变量

时间:2012-08-15 04:16:48

标签: python variables dynamic

我的问题是如何“动态”创建变量。我正在尝试使用一组随机属性生成一个对象。

from random import randint, choice

class Person(object):
    def __init__(self):
      self.attributes = []    

possible_attributes= ['small', 'black', 'scary', 'smelly', 'happy'] # idk, random
chance = randint(1,5)

chosen_attributes = []
for i in xrange(chance):
    #psuedo code...
    local_var = choice(possible_attributes)
    if local_var not in chosen_attributes:
        VAR = local_var # VAR needs to be dynamic and 'global' for use later on
        chosen_attributes.append(local_var)
        Person.attributes.append(local_var)

我很肯定我想要做到这一点并不是一个好方法,所以如果有人理解我正在寻找什么并且可以提供更好的方法(一个适用于初学者的方法)我会非常感激。谢谢!

6 个答案:

答案 0 :(得分:2)

要向类的实例添加属性,可以使用.__dict__

class Person(object):
    def addattr(self,x,val):
        self.__dict__[x]=val

<强>输出:

>>> a=Person()
>>> a.addattr('foo',10)
>>> a.addattr('bar',20)
>>> a.foo
10
>>> a.bar
20
>>> b=Person()
>>> b.addattr('spam','somevalue')
>>> b.spam
'somevalue'

答案 1 :(得分:2)

嗯,我不确定你在这里想要达到什么目的,但这里可能会有一些事情......

class Person(object):
    def __init__(self):
        self.attributes = [] 

这定义了一个类对象,您可以从中创建包含attributes的对象,正如我们在__init__或构造函数中看到的那样,在其他一些语言中调用它。

但你有

Person.attributes.append(local_var)

这里Person是一个类对象,它实际上没有定义的属性,因为它只适用于从这个类创建的对象......

您可以创建新人并为其添加适当的属性。

>>> me = Person()
>>> me.attributes.append('humble')

其次我们不应该直接访问属性,因为任何东西都可以附加到列表中,包括重复的属性。

所以为什么不简单地添加一个添加属性的函数。

class Person(object):
    def __init__(self):
        self._attributes = [] # note any variable starting with _ is meant to be private 
    def add_attribute(attribute):
        if attribute not in self._attributes:
            self._attributes.append(attribute)

如果性能是一个问题我们可以使用set()而不是[],因为它不允许重复输入并且真正快速检查任何查找,缺点是值必须是哈希值 - 能够即字符串或整数或其他简单的数据类型...

答案 2 :(得分:1)

使用vars。例如:

>>> import math
>>> class foo: pass
>>> vars(foo)
{'__module__': '__main__', '__doc__': None}
>>> vars(foo)['fn']=math.sin
>>> foo.fn(2)
0.9092974268256817
>>> vars(foo)
{'__module__': '__main__', '__doc__': None, 'fn': <built-in function sin>}

如您所知,方法只是一个参数的函数。

答案 3 :(得分:1)

虽然我无法真正告诉你需要什么,但我猜你实际上并不想要全局变量,只是一个具有随机/动态属性集的Person对象。为此,您需要setattrrandom.sample()

crazy_person = Person()
selected_attribute_names = random.sample(possible_attributes, 3)
for attribute_name in selected_attribute_names:
    setattr(crazy_person, attribute_name, True)

# optional -- if you want to have a list of attributes, just copy that in:
crazy_person.attributes = selected_attribute_names
# vars(crazy_person).keys() will give you more or less the same thing though, for free

# hasattr(crazy_person, 'small') will tell you if you picked 'small'
# if we chose 'small', then from here on, crazy_person.small will be True as well

答案 4 :(得分:0)

根据您的定义,我可以使用随机属性集构建对象:

import random

possible_attributes= ['small', 'black', 'scary', 'smelly', 'happy']

class Person(object):
    def __init__(self):
      self.attributes = random.sample(possible_attributes, random.randint(0, len(possible_attributes)))

这会从可能属性列表中选择随机数量的属性。

>>> print Person().attributes
['small', 'smelly']
>>> print Person().attributes
['scary', 'smelly', 'happy']

答案 5 :(得分:0)

通常,您不希望添加到全局变量,而不是污染全局命名空间。字典提供了一种类似命名空间的方式来访问所有内容,但是如果你真的必须这样做,可以使用globals()[x] =修改项目的东西,或者使用非常讨厌的

exec "var_name=somehting"