クラスがあるとします:
class Foo(object):
def __init__(self,d):
self.d=d
d={'a':1,'b':2}
inst=Foo(d)
inst.d
Out[315]: {'a': 1, 'b': 2}
各属性がdictキーになるn個の属性を動的に作成する方法はありますか?などinst.a
を返し1
ます。
クラスがあるとします:
class Foo(object):
def __init__(self,d):
self.d=d
d={'a':1,'b':2}
inst=Foo(d)
inst.d
Out[315]: {'a': 1, 'b': 2}
各属性がdictキーになるn個の属性を動的に作成する方法はありますか?などinst.a
を返し1
ます。
class Foo(object):
def __init__(self, attributes):
self.__dict__.update(attributes)
それはそれをするでしょう。
>>>foo = Foo({'a': 42, 'b': 999})
>>>foo.a
42
>>>foo.b
999
setattr
組み込みメソッドを使用することもできます。
class Foo(object):
def __init__(self, attributes):
for attr, value in attributes.iteritems():
setattr(self, attr, value)
使用setattr()
:
>>> class foo(object):
def __init__(self, d):
self.d = d
for x in self.d:
setattr(self, x, self.d[x])
>>> d = {'a': 1, 'b': 2}
>>> l = foo(d)
>>> l.d
{'a': 1, 'b': 2}
>>> l.a
1
>>> l.b
2
>>>
これは、pythonm が提供するものよりもさらに風変わりなソリューションです。
class Foo(object):
def __init__(self, d):
self.__dict__ = d
を使用する代わりに、直接inst.d
使用してください。inst.__dict__
追加の利点は、追加された新しいキーがd
自動的に属性になることです。それはそれが得られるのと同じくらいダイナミックです。
も使用できます__getattr__
。
class Foo(object):
def __init__(self, d):
self.d = d
def __getattr__(self, name):
return self.d[name]
次のようなことができます。
class Foo(object):
def __init__(self, **kwdargs):
self.__dict__.update(kwdargs)
d = {'a':1,'b':2}
foo = Foo(**d)
foo2 = Foo(a=1, b=2)