0

我的问题是如何“动态”创建变量。我正在尝试生成具有随机属性集的对象。

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)

我很肯定我想要这样做不是一个好方法,所以如果有人理解我在寻找什么并且可以提供更好的方法(一种适用于初学者的方法),我将不胜感激。

4

6 回答 6

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'
于 2012-08-15T04:18:34.967 回答
2

好吧,我不确定您要在这里实现什么目标,但是这里可能有几件事....

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

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

但是你有

Person.attributes.append(local_var)

Person是一个类对象,它确实没有 where 定义的属性,因为它仅适用于从此类创建的对象...

您可以创建一个新人并向他们添加适当的属性。

>>> 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)

如果性能是一个问题,我们可以使用 aset()而不是,[]因为它不允许重复条目并且非常快速地检查任何查找,缺点是值必须是可散列的,即字符串或整数或其他简单的数据类型......

于 2012-08-15T04:40:31.603 回答
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>}

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

于 2012-08-15T04:22:22.193 回答
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
于 2012-08-15T04:24:49.223 回答
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']
于 2012-08-15T04:20:49.193 回答
0

通常,您不想添加全局命名空间,而不是污染全局命名空间。字典提供了一种类似命名空间的方式来访问所有内容,但如果你真的需要,使用 globals()[x] =something 来修改项目,或者使用非常讨厌的

exec "var_name=somehting"
于 2012-08-15T04:21:29.340 回答