2014-11-22 78 views
0

我见过蟒蛇一类做这种事:Python类成员动态名

OBJ = A类(NAME = “somename”) obj.somename =东西

。即类初始化创建了一个名为参数字符串的成员。 我无法设法重现此行为。有任何想法吗?

我设法使用globals()[“name”] = value来做类似的事情。但是在这种情况下,创建的对象是不是“Class”对象的模块的儿子。它可以作为module.somename而不是obj.somename来调用。

+0

你可以做'obj.somename = something'上*类的所有*实例(也没有定义'__slots__')。问题是,你是否期望一些特定的行为,比如属性是用什么进行初始化? – 2014-11-22 11:22:22

回答

1

您可以轻松地通过使用setattr创建一个动态命名成员:

>>> class Foo(object): 
...  def __init__(self, name): 
...   setattr(self, name, 42) 
... 
>>> f = Foo('bar') 
>>> f.bar 
42 
>>> f.bar = 'hello' 
>>> f.bar 
'hello' 

不过请注意,这只是设置任何属性上的类的实例是可能的任何普通班(即没有定义 ):

>>> class Qux(object): 
...  pass 
... 
>>> q = Qux() 
>>> q.foobar = 'hello' 
>>> q.foobar 
'hello' 
0

您可以创建一个动态命名固定值属性是这样的:

class MyClass(): 
    def __init__(self, attr): 
     self.__dict__[attr] = 'some_value' 

或者作为调用函数要创造尽可能多的属性:

class MyClass(): 
    def __init__(self, *argv, **kwargs): 
     for key,value in kwargs.items(): 
      self.__dict__[key] = value