2014-11-22 62 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