我的问题是如何“动态”创建变量。我正在尝试使用一组随机属性生成一个对象。
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)
我很肯定我想要做到这一点并不是一个好方法,所以如果有人理解我正在寻找什么并且可以提供更好的方法(一个适用于初学者的方法)我会非常感激。谢谢!
答案 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对象。为此,您需要setattr
和random.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"