python 사전에서 속성 설정
각 키가 해당 개체의 속성이 되는 방식으로 파이썬 사전에서 개체를 만드는 것이 가능합니까?
이와 같은 것:
d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
e = Employee(d)
print e.name # Oscar
print e.age + 10 # 42
저는 이 질문과 거의 반대일 것이라고 생각합니다.개체 필드의 Python 사전
물론, 다음과 같은 것이 있습니다.
class Employee(object):
def __init__(self, initial_data):
for key in initial_data:
setattr(self, key, initial_data[key])
갱신하다
Brent Nash가 제안하는 것처럼 키워드 인수도 허용하여 이를 보다 유연하게 만들 수 있습니다.
class Employee(object):
def __init__(self, *initial_data, **kwargs):
for dictionary in initial_data:
for key in dictionary:
setattr(self, key, dictionary[key])
for key in kwargs:
setattr(self, key, kwargs[key])
그러면 다음과 같이 부를 수 있습니다.
e = Employee({"name": "abc", "age": 32})
이런 식으로.
e = Employee(name="abc", age=32)
심지어 이렇게도:
employee_template = {"role": "minion"}
e = Employee(employee_template, name="abc", age=32)
이러한 방식으로 속성을 설정하는 것은 문제를 해결하는 최선의 방법이 아닙니다.다음 중 하나:
여러분은 모든 분야가 시간보다 앞서야 하는 것을 알고 있습니다.이 경우 모든 특성을 명시적으로 설정할 수 있습니다.이것은 다음과 같습니다.
class Employee(object): def __init__(self, name, last_name, age): self.name = name self.last_name = last_name self.age = age d = {'name': 'Oscar', 'last_name': 'Reyes', 'age':32 } e = Employee(**d) print e.name # Oscar print e.age + 10 # 42
또는
당신은 모든 분야가 시간보다 앞서야 하는 것이 무엇인지 모릅니다.이 경우 데이터를 개체 네임스페이스를 오염시키는 대신 딕트로 저장해야 합니다.속성은 정적 액세스를 위한 것입니다.이 사건은 다음과 같이 보입니다.
class Employee(object): def __init__(self, data): self.data = data d = {'name': 'Oscar', 'last_name': 'Reyes', 'age':32 } e = Employee(d) print e.data['name'] # Oscar print e.data['age'] + 10 # 42
기본적으로 사례 1과 동일한 또 다른 솔루션은 다음을 사용하는 것입니다.collections.namedtuple
구현 방법은 Van의 답변을 참조하십시오.
다음을 사용하여 개체의 특성에 액세스할 수 있습니다.__dict__
업데이트 방법을 호출합니다.
>>> class Employee(object):
... def __init__(self, _dict):
... self.__dict__.update(_dict)
...
>>> dict = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
>>> e = Employee(dict)
>>> e.name
'Oscar'
>>> e.age
32
속성 이름을 사전의 키로 사용하는 것이 어떻습니까?
class StructMyDict(dict):
def __getattr__(self, name):
try:
return self[name]
except KeyError as e:
raise AttributeError(e)
def __setattr__(self, name, value):
self[name] = value
명명된 인수, 튜플 목록, 사전 또는 개별 속성 할당을 사용하여 초기화할 수 있습니다. 예:
nautical = StructMyDict(left = "Port", right = "Starboard") # named args
nautical2 = StructMyDict({"left":"Port","right":"Starboard"}) # dictionary
nautical3 = StructMyDict([("left","Port"),("right","Starboard")]) # tuples list
nautical4 = StructMyDict() # fields TBD
nautical4.left = "Port"
nautical4.right = "Starboard"
for x in [nautical, nautical2, nautical3, nautical4]:
print "%s <--> %s" % (x.left,x.right)
또는 속성 오류를 높이는 대신 알 수 없는 값에 대해 없음을 반환할 수 있습니다.(web2py 스토리지 클래스에서 사용되는 트릭)
예를 들어 말하다
class A():
def __init__(self):
self.x=7
self.y=8
self.z="name"
한 번에 속성을 설정하려는 경우
d = {'x':100,'y':300,'z':"blah"}
a = A()
a.__dict__.update(d)
제 생각에 그 대답은settattr
만약 당신이 정말로 지원이 필요하다면 가는 길입니다.dict
.
하지만 만약에Employee
객체는 점 구문으로 액세스할 수 있는 구조일 뿐입니다..name
dict 구문 대신 (['name']
), 다음과 같이 명명된 튜플을 사용할 수 있습니다.
from collections import namedtuple
Employee = namedtuple('Employee', 'name age')
e = Employee('noname01', 6)
print e
#>> Employee(name='noname01', age=6)
# create Employee from dictionary
d = {'name': 'noname02', 'age': 7}
e = Employee(**d)
print e
#>> Employee(name='noname02', age=7)
print e._asdict()
#>> {'age': 7, 'name': 'noname02'}
당신은 가지고 있습니다._asdict()
모든 속성을 사전으로 액세스하는 방법이지만 나중에 추가 속성을 추가할 수는 없습니다.
딕트를 사용하는 것과 비슷하게, 당신은 그냥 다음과 같은 kwargs를 사용할 수 있습니다.
class Person:
def __init__(self, **kwargs):
self.properties = kwargs
def get_property(self, key):
return self.properties.get(key, None)
def main():
timmy = Person(color = 'red')
print(timmy.get_property('color')) #prints 'red'
라이브러리를 사용해도 괜찮으시다면:
pip install domonic
그러면 다음을 수행할 수 있습니다.
from domonic.javascript import Object
class Employee(Object):
pass
d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
e = Employee(d)
print(e.name)
print(e['name'])
print(e)
# {'name': 'Oscar', 'lastName': 'Reyes', 'age': 32}
필요에 따라 작동해야 합니다.
언급URL : https://stackoverflow.com/questions/2466191/set-attributes-from-dictionary-in-python
'programing' 카테고리의 다른 글
Angular 2 테스트 - 비동기 함수 호출 - 사용 시기 (0) | 2023.07.26 |
---|---|
Xampp Code Igniter 3 + MariaDB 프로젝트를 github에 푸시하는 이상적인 방법은 무엇입니까? (0) | 2023.07.26 |
개체의 속성 이름을 가져오는 중 (0) | 2023.07.26 |
php를 사용하여 두 날짜 사이에 임의의 날짜를 생성하는 방법은 무엇입니까? (0) | 2023.07.26 |
다국어 데이터베이스 설계를 위한 모범 사례는 무엇입니까? (0) | 2023.07.26 |