객체를 생성하고 속성을 추가하려면 어떻게해야합니까?
파이썬에서 동적 객체 (다른 객체 내부)를 만들고 속성을 추가하고 싶습니다.
나는 시도했다 :
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']
클래스 객체를 직접 사용할 수도 있습니다. 네임 스페이스를 만듭니다.
class a: pass
a.somefield1 = 'somevalue1'
setattr(a, 'somefield2', 'somevalue2')
문서에서 말하는 것처럼 :
참고 :
object
않습니다 하지 을__dict__
할 수 있도록하지 할당 임의의 속성의 인스턴스,object
클래스입니다.
더미 클래스 인스턴스를 사용할 수 있습니다.
이러한 솔루션은 테스트 중에 매우 유용합니다. 다른 사람의 답변을 바탕으로 파이썬 2.7.9 에서이 작업을 수행합니다 (정적 방법없이 TypeError (바인드되지 않은 메소드 ...)).
In [11]: auth = type('', (), {})
In [12]: auth.func = staticmethod(lambda i: i * 2)
In [13]: auth.func(2)
Out[13]: 4
어떤 개체를 사용하고 있습니까? 샘플 클래스를 사용하여 시도했지만 정상적으로 작동했습니다.
class MyClass:
i = 123456
def f(self):
return "hello world"
b = MyClass()
b.c = MyClass()
setattr(b.c, 'test', 123)
b.c.test
그리고 나는 123
대답으로 얻었다 .
내가 실패하는 유일한 상황 setattr
은 내장 객체를 사용하는 경우입니다.
업데이트 : 의견에서 이것은 반복됩니다 : 왜 파이썬에서 객체에 속성을 추가 할 수 없습니까?
늦은 시간에오고 있지만 여기에 응용 프로그램에서 유용한 경로를 유지하는 객체가있는 내 동전이 있습니다. 그러나 getattr 및 도트 표기법으로 액세스 할 수있는 일종의 정보를 원하는 모든 곳에 적용 할 수 있습니다 (이 질문이 실제로 생각한 것입니다) :
import os
def x_path(path_name):
return getattr(x_path, path_name)
x_path.root = '/home/x'
for name in ['repository', 'caches', 'projects']:
setattr(x_path, name, os.path.join(x_path.root, name))
지금은 멋지다.
In [1]: x_path.projects
Out[1]: '/home/x/projects'
In [2]: x_path('caches')
Out[2]: '/home/x/caches'
따라서 위의 답변과 같은 함수 객체를 사용하지만 함수를 사용하여 값을 얻습니다 ( 원하는 경우 (getattr, x_path, 'repository')
보다는 여전히 사용할 수 있음 x_path('repository')
).
중첩 된 객체를 만들기 전에 모든 속성과 값을 결정하고 집계 할 수 있으면 생성시 사전 인수를 사용하는 새 클래스를 만들 수 있습니다.
# python 2.7
class NestedObject():
def __init__(self, initial_attrs):
for key in initial_attrs:
setattr(self, key, initial_attrs[key])
obj = someobject
attributes = { 'attr1': 'val1', 'attr2': 'val2', 'attr3': 'val3' }
obj.a = NestedObject(attributes)
>>> obj.a.attr1
'val1'
>>> obj.a.attr2
'val2'
>>> obj.a.attr3
'val3'
키워드 인수도 허용 할 수 있습니다. 이 게시물을 참조하십시오 .
class NestedObject(object):
def __init__(self, *initial_attrs, **kwargs):
for dictionary in initial_attrs:
for key in dictionary:
setattr(self, key, dictionary[key])
for key in kwargs:
setattr(self, key, kwargs[key])
obj.a = NestedObject(attr1='val1', attr2='val2', attr3= 'val3')
di = {}
for x in range(20):
name = '_id%s' % x
di[name] = type(name, (object), {})
setattr(di[name], "attr", "value")
내가 보는 다른 방법,이 방법 :
import maya.cmds
def getData(objets=None, attrs=None):
di = {}
for obj in objets:
name = str(obj)
di[name]=[]
for at in attrs:
di[name].append(cmds.getAttr(name+'.'+at)[0])
return di
acns=cmds.ls('L_vest_*_',type='aimConstraint')
attrs=['offset','aimVector','upVector','worldUpVector']
getData(acns,attrs)
참고 URL : https://stackoverflow.com/questions/2827623/how-can-i-create-an-object-and-add-attributes-to-it
'IT' 카테고리의 다른 글
Python을 사용하여 공급자로서 Gmail로 이메일을 보내는 방법은 무엇입니까? (0) | 2020.03.27 |
---|---|
iPhone 응용 프로그램을 종료하는 올바른 방법은 무엇입니까? (0) | 2020.03.27 |
Django ModelAdmin의“list_display”가 ForeignKey 필드의 속성을 표시 할 수 있습니까? (0) | 2020.03.27 |
데이터 URI를 파일로 변환 한 다음 FormData에 추가 (0) | 2020.03.27 |
비 대화식으로 psql에 암호를 지정하려면 어떻게해야합니까? (0) | 2020.03.27 |