반응형
내 수업에는 다음과 같은 사전이 있습니다.
class MyClass(object):
def __init__(self):
self.data = {'a': 'v1', 'b': 'v2'}
그런 다음 MyClass 인스턴스와 함께 dict의 키를 사용하여 dict에 액세스하고 싶습니다. 예를 들면 다음과 같습니다.
ob = MyClass()
v = ob.a # Here I expect ob.a returns 'v1'
나는 이것이 __getattr__에 의해 구현되어야한다는 것을 알고 있지만, 저는 파이썬을 처음 접했고 그것을 구현하는 방법을 정확히 모릅니다.
해결 방법
class MyClass(object):
def __init__(self):
self.data = {'a': 'v1', 'b': 'v2'}
def __getattr__(self, attr):
return self.data[attr]
>>> ob = MyClass()
>>> v = ob.a
>>> v
'v1'
하지만 __ setattr __
을 구현할 때는주의해야합니다. 몇 가지 수정이 필요합니다.
class MyClass(object):
def __init__(self):
# prevents infinite recursion from self.data = {'a': 'v1', 'b': 'v2'}
# as now we have __setattr__, which will call __getattr__ when the line
# self.data[k] tries to access self.data, won't find it in the instance
# dictionary and return self.data[k] will in turn call __getattr__
# for the same reason and so on.... so we manually set data initially
super(MyClass, self).__setattr__('data', {'a': 'v1', 'b': 'v2'})
def __setattr__(self, k, v):
self.data[k] = v
def __getattr__(self, k):
# we don't need a special call to super here because getattr is only
# called when an attribute is NOT found in the instance's dictionary
try:
return self.data[k]
except KeyError:
raise AttributeError
>>> ob = MyClass()
>>> ob.c = 1
>>> ob.c
1
속성을 설정할 필요가 없으면 namedtuple을 사용하십시오. 예.
>>> from collections import namedtuple
>>> MyClass = namedtuple("MyClass", ["a", "b"])
>>> ob = MyClass(a=1, b=2)
>>> ob.a
1
기본 인수를 원하면 그 주위에 래퍼 클래스를 작성할 수 있습니다.
class MyClass(namedtuple("MyClass", ["a", "b"])):
def __new__(cls, a="v1", b="v2"):
return super(MyClass, cls).__new__(cls, a, b)
또는 함수로서 더 좋아 보일 수도 있습니다.
def MyClass(a="v1", b="v2", cls=namedtuple("MyClass", ["a", "b"])):
return cls(a, b)
>>> ob = MyClass()
>>> ob.a
'v1'
참조 페이지 https://stackoverflow.com/questions/16237659
반응형
'파이썬' 카테고리의 다른 글
파이썬 열에 팬더 함수를 적용하여 여러 개의 새 열을 만드시겠습니까? (0) | 2021.01.18 |
---|---|
파이썬 Ubuntu 12.10에서 Python Pip의 시스템 버전을 망쳤습니다. (0) | 2021.01.18 |
파이썬 배열에서 낮은 값을 0으로 만드는 가장 빠른 방법은 무엇입니까? (0) | 2021.01.18 |
파이썬 기존 값보다 큰 값의 첫 번째 Numpy (0) | 2021.01.18 |
파이썬 아름다운 수프와 레를 사용하여 특정 텍스트를 포함하는 특정 클래스로 스팬을 찾는 방법은 무엇입니까? (0) | 2021.01.18 |
댓글