__getattr_와 __getattribute_의 차이점 이해
는 이 두 가지 하고 있습니다.__getattr__
★★★★★★★★★★★★★★★★★」__getattribute__
하지만, 나는 그것에 실패하고 있다.
__getattribute__
는 오브젝트의 실제 Atribute를 조사하기 전에 호출되기 때문에 올바르게 구현하기 어려울 수 있습니다.을 사용하다
난 그게 무슨 뜻인지 전혀 모르겠어.
그런 다음 다음과 같이 표시됩니다.
넌 거의 확실히 원하는구나
__getattr__
.
왜요?
가 읽은 것은 ★★★★★★★★★★★★★★★★★★★★★★★★.__getattribute__
실패,__getattr__
왜 두 가지 요?그럼 왜 같은 일을 하는 두 가지 다른 방법이 있는 걸까요?내 코드로 새로운 스타일의 클래스가 구현될 경우 무엇을 사용해야 합니까?
이 문제를 해결하기 위해 몇 가지 코드 예를 찾고 있습니다.나는 최선을 다해 구글을 검색했지만, 내가 찾은 답변은 그 문제에 대해 충분히 논의하지 않았다.
서류가 있으면 읽을 준비가 되어 있습니다.
기본적인 것부터.
오브젝트의 경우 오브젝트의 속성을 처리해야 합니다.이렇게 해요.instance.attribute
(속성의 이름을 사전에 모르는 경우) 제어가 필요할 수 있습니다.
를 들어, 「」라고 하는 것은,instance.attribute
될 것이다getattr(instance, attribute_name)
이 모델을 사용하면 attribute_name을 문자열로 지정함으로써 속성을 얻을 수 있습니다.
「」의 __getattr__
, 하는 도 알려 줄 수 있습니다.__getattr__
★★★★★★ 。
Python은 아직 정의되지 않은 속성을 요청할 때마다 이 메서드를 호출하므로 사용자가 이 메서드로 수행할 작업을 정의할 수 있습니다.
전형적인 사용 사례:
class A(dict):
def __getattr__(self, name):
return self[name]
a = A()
# Now a.somekey will give a['somekey']
및 __getattribute__
존재 여부에 관계없이 모든 속성을 캐치해야 하는 경우__getattribute__
가 있다, 차이가 있다, 차이가 있다.__getattr__
실제로 존재하지 않는 속성만 호출됩니다.하면 Atribute를 호출하지 하면 Atribute를 호출하지 Atribute를 합니다.__getattr__
.
__getattribute__
항상 불리고 있습니다.
__getattribute__
속죄하다
class Foo(object):
def __init__(self, a):
self.a = 1
def __getattribute__(self, attr):
try:
return self.__dict__[attr]
except KeyError:
return 'default'
f = Foo(1)
f.a
이치.return self.__dict__[attr]
이 (self.__dict__
그 이름으로 이용하실 수 있습니다.
f.a
을 합니다.a
「」의 어트리뷰트f
. 은 " " 를 호출합니다f.__getattribute__('a')
__getattribute__
로드를 합니다.self.__dict__
__dict__
는 의 입니다.self == f
은 "비둘기"라고 부릅니다.f.__getattribute__('__dict__')
합니다.'__dict__
재귀입니다.' 무한 재귀입니다.
if__getattr__
사용되었습니다.
f
있다a
여하하다- 이 되어 있는 예를 들어, 「아까」를
f.b
__dict__
하고 있기__getattr__
는 Atribute를 검출하는 다른 모든 메서드가 실패한 경우에만 호출됩니다.
의 에서 '은 '올바른' 글쓰기입니다__getattribute__
하고 있다
class Foo(object):
# Same __init__
def __getattribute__(self, attr):
return super(Foo, self).__getattribute__(attr)
super(Foo, self).__getattribute__(attr)
__getattribute__
오브젝트에 가까운'공식적으로는 Order의 다음 의 메서드입니다.self
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★♪
하려면 , 「」를 사용합니다.__getattr__
Python은 속성을 찾을 때까지 정상적인 작업을 수행합니다.이 시점에서 Python은 사용자에게 제어권을 이양합니다.__getattr__
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
무한 할 수 있다는 점도 할 점은, 재귀가 발생할 수 .__getattr__
.
class Foo(object):
def __getattr__(self, attr):
return self.attr
그건 연습으로 남겨둘게요.
도 이 차이를 잘 것요.__getattr__
★★★★★★★★★★★★★★★★★」__getattribute__
한 하지 않은 왜 '나', '나', '나', '나'를 사용하려고 하는지입니다__getattribute__
의 멋진 점__getattribute__
기본적으로 클래스에 액세스할 때 점을 오버로드할 수 있습니다.이를 통해 낮은 수준에서 속성에 액세스하는 방법을 사용자 정의할 수 있습니다.예를 들어, self 인수만 사용하는 모든 메서드가 속성으로 처리되는 클래스를 정의한다고 가정합니다.
# prop.py
import inspect
class PropClass(object):
def __getattribute__(self, attr):
val = super(PropClass, self).__getattribute__(attr)
if callable(val):
argcount = len(inspect.getargspec(val).args)
# Account for self
if argcount == 1:
return val()
else:
return val
else:
return val
인터랙티브 인터프리터:
>>> import prop
>>> class A(prop.PropClass):
... def f(self):
... return 1
...
>>> a = A()
>>> a.f
1
않을 이에서는, 「이러한 예」를 덮어쓰는 수 을 알 수 .__getattribute__
.
나는 다른 사람의 훌륭한 설명을 훑어보았다.하지만, 이 블로그 Python Magic Methods 와 에서 간단한 답변을 찾았습니다.다음은 모두 거기서 나온 것입니다.
「 」의 __getattr__
매직 메서드에서는 존재하지 않는 속성 조회를 대행 수신하여 실패하지 않도록 할 수 있습니다.
class Dummy(object):
def __getattr__(self, attr):
return attr.upper()
d = Dummy()
d.does_not_exist # 'DOES_NOT_EXIST'
d.what_about_this_one # 'WHAT_ABOUT_THIS_ONE'
, 「Atribute가 존재하다」__getattr__
다음 중 하나:
class Dummy(object):
def __getattr__(self, attr):
return attr.upper()
d = Dummy()
d.value = "Python"
print(d.value) # "Python"
__getattribute__
와 유사하다__getattr__
있습니다.__getattribute__
는 모든 Atribute lookup을 대행 수신합니다.Atribute의 유무는 중요하지 않습니다.
class Dummy(object):
def __getattribute__(self, attr):
return 'YOU SEE ME?'
d = Dummy()
d.value = "Python"
print(d.value) # "YOU SEE ME?"
예에서는, 「」를 해 주세요.d
을 사용법 수 Python'은 무엇이든 수 .을 사용하다__getattribute__
반환했다.즉, 가치 속성이 사실상 상실되어 "도달할 수 없는" 상태가 된 것입니다.
언급URL : https://stackoverflow.com/questions/4295678/understanding-the-difference-between-getattr-and-getattribute
'programing' 카테고리의 다른 글
내비게이션 드로어 항목 아이콘이 원래 색상을 나타내지 않음 (0) | 2022.09.30 |
---|---|
SIGTERM 신호를 정상적으로 처리하는 방법 (0) | 2022.09.23 |
스프링 보안 표현식 언어 주석에서 사용할 사용자 지정 메서드를 만드는 방법 (0) | 2022.09.23 |
팬더 데이터 프레임 열 또는 열에서 목록을 얻으시겠습니까? (0) | 2022.09.23 |
무엇:이 오류-치명적 오류를 일으키고 있다.지역 grunt"를 찾을 수 없습니다. (0) | 2022.09.23 |