[python] 객체를 생성하고 속성을 추가하려면 어떻게해야합니까?

파이썬에서 동적 객체 (다른 객체 내부)를 만들고 속성을 추가하고 싶습니다.

나는 시도했다 :

obj = someobject
obj.a = object()
setattr(obj.a, 'somefield', 'somevalue')

그러나 이것은 효과가 없었습니다.

어떤 아이디어?

편집하다:

for값 목록을 반복하는 루프 에서 속성을 설정하고 있습니다.

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable

내가 얻을 것입니다 위의 예에서 obj.a.attr1, obj.a.attr2, obj.a.attr3.

루프 에서 setattr수행하는 방법을 몰랐기 때문에 함수를 사용했습니다 .obj.a.NAMEfor

p위의 예에서 값을 기준으로 속성을 어떻게 설정 합니까?



답변

내 고대 번치 레시피를 사용할 수 있지만 “번치 클래스”를 만들지 않으려면 파이썬에 이미 존재하는 매우 간단한 클래스가 있습니다. 모든 함수는 람다 함수를 포함하여 임의의 속성을 가질 수 있습니다. 따라서 다음과 같이 작동합니다.

obj = someobject
obj.a = lambda: None
setattr(obj.a, 'somefield', 'somevalue')

훌륭한 Bunch레시피 와 비교할 때 선명도의 손실이 괜찮은지 여부는 스타일 결정입니다.


답변

내장 기능을 object인스턴스화 할 수 있지만 속성을 설정할 수는 없습니다. (이 정확한 목적을 위해 가능할 수 있기를 바랍니다.) __dict__속성을 보유 할 필요가 없습니다 .

나는 일반적으로 이것을한다 :

class Object(object):
    pass

a = Object()
a.somefield = somevalue

내가 할 수있을 때, Object어떤 종류의 데이터를 넣었는지에 따라 수업에 더 의미있는 이름을 부여 합니다.

어떤 사람들 dict은 속성 접근이 키를 얻을 수 있도록 하는 하위 클래스를 사용하는 다른 일을 합니다. ( d.key대신 d['key'])

편집 : 귀하의 질문에 추가하여 사용하는 setattr것이 좋습니다. 당신은 사용할 수 없습니다 setattrobject()인스턴스.

params = ['attr1', 'attr2', 'attr3']
for p in params:
    setattr(obj.a, p, value)


답변

types.SimpleNamespacePython 3.3+ 에는 클래스 가 있습니다 .

obj = someobject
obj.a = SimpleNamespace()
for p in params:
    setattr(obj.a, p, value)
# obj.a.attr1

collections.namedtuple, typing.NamedTuple불변의 객체에 사용될 수 있습니다. PEP 557-데이터 클래스 는 변경 가능한 대안을 제안합니다.

더 풍부한 기능을 위해 attrspackage을 사용해 볼 수 있습니다. 사용법 예를 참조하십시오 .


답변

이 목표를 달성 할 수있는 몇 가지 방법이 있습니다. 기본적으로 확장 가능한 객체가 필요합니다.

obj.a = type('Test', (object,), {})
obj.a.b = 'fun'

obj.b = lambda:None

class Test:
  pass
obj.c = Test()


답변

mock모듈은 기본적으로 그 위해 만들어졌다.

import mock
obj = mock.Mock()
obj.a = 5


답변

이제 할 수 있습니다 (evilpie와 같은 대답인지 확실하지 않음).

MyObject = type('MyObject', (object,), {})
obj = MyObject()
obj.value = 42


답변

아래 코드를 사용해보십시오 :

$ python
>>> class Container(object):
...     pass
...
>>> x = Container()
>>> x.a = 10
>>> x.b = 20
>>> x.banana = 100
>>> x.a, x.b, x.banana
(10, 20, 100)
>>> dir(x)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__',
'__getattribute__', '__hash__', '__init__', '__module__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__',     '__sizeof__',
'__str__', '__subclasshook__', '__weakref__', 'a', 'b', 'banana']