파이썬에서 동적 객체 (다른 객체 내부)를 만들고 속성을 추가하고 싶습니다.
나는 시도했다 :
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.NAME
for
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
것이 좋습니다. 당신은 사용할 수 없습니다 setattr
에 object()
인스턴스.
params = ['attr1', 'attr2', 'attr3']
for p in params:
setattr(obj.a, p, value)
답변
types.SimpleNamespace
Python 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-데이터 클래스 는 변경 가능한 대안을 제안합니다.
더 풍부한 기능을 위해 attrs
package을 사용해 볼 수 있습니다. 사용법 예를 참조하십시오 .
답변
이 목표를 달성 할 수있는 몇 가지 방법이 있습니다. 기본적으로 확장 가능한 객체가 필요합니다.
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']