programing

__getattr_와 __getattribute_의 차이점 이해

randomtip 2022. 9. 23. 21:46
반응형

__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__ 사용되었습니다.

  1. f 있다a여하하다
  2. 이 되어 있는 예를 들어, 「아까」를 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

반응형