Разница между __get__ и __getattribute__ [duplicate]

Минимальный пример

window.onload = function() {
  var resultElem = document.getElementById('result')
  document.getElementById('1').addEventListener(
    'click',
    function(event) {
      resultElem.innerHTML += ('<div>target: ' + event.target.id + '</div>')
      resultElem.innerHTML += ('<div>currentTarget: ' + event.currentTarget.id + '</div>')
    },
    false
  )
  document.getElementById('2').dispatchEvent(
          new Event('click', { bubbles:true }))
}
<div id="1">1
  <div id="2">2
  </div>
</div>
<div id="result">
  <div>result:</div>
</div>

Когда клик по 2 и отображается на 1, результат:

target: 2
currentTarget: 1

, потому что в этом случае:

  • 2 - это элемент, который инициировал событие
  • 1 - это элемент, который прослушивал к событию
22
задан Zearin 29 January 2012 в 03:22
поделиться

1 ответ

Документация по каждому указанному вами методу легко достижима из индекса документации .

В любом случае это может быть немного расширенной ссылкой:

__get__, __set__ и __del__ являются дескрипторами

«В двух словах , дескриптор - это способ настройки того, что происходит, когда вы ссылаетесь на атрибут на модели. " [Official doc link]

Они хорошо объясняются вокруг, поэтому здесь есть некоторые ссылки:

__getattr__, __getattribute__, __setattr__ , __delattr__

Определены методы, которые могут быть определены для настройки значения доступа к атрибуту (использование, назначение или удаление x.name) для экземпляров класса. [официальный doc-канал]

Пример 1:

class Foo:
    def __init__(self):
        self.x = 10
    def __getattr__(self, name):
        return name

f = Foo()
f.x    # -> 10
f.bar   # -> 'bar'

Пример 2:

class Foo:
    def __init__(self):
        self.x = 10
    def __getattr__(self,name):
        return name
    def __getattribute__(self, name):
        if name == 'bar':
            raise AttributeError
        return 'getattribute'

f = Foo()
f.x    # -> 'getattribute'
f.baz    # -> 'getattribute'
f.bar    # -> 'bar'

__getitem__, __setitem__, __delitem__

Способы, которые можно определить для реализации объектов-контейнеров. [официальный doc-ссылка]

Пример :

class MyColors:
    def __init__(self):
        self._colors = {'yellow': 1, 'red': 2, 'blue': 3}
    def __getitem__(self, name):
        return self._colors.get(name, 100)

colors = MyColors()
colors['yellow']   # -> 1
colors['brown']    # -> 100

Надеюсь, этого достаточно, чтобы дать вам общую идею.

27
ответ дан Community 17 August 2018 в 21:13
поделиться
  • 1
    (1) Я понял, что за 25 минут до того, как я нашел ваш ответ, они фактически документированы на одной странице. Извините за эту ошибку в моем исходном вопросе. (2) Спасибо! Статьи Марти Алчина написаны очень хорошо. И они прояснили что-то огромное, чего я не получал: __get__ и __set__ должны быть определены в атрибутах , а не в классе! Я все еще думаю, что все методы в моем оригинальном посте могут делать с более дифференцируемыми именами, но я внезапно чувствую себя намного менее подавленным. Спасибо. ☺ – Zearin 29 January 2012 в 03:18
  • 2
    @Zearin: Есть хорошая статья о Атрибутах и ​​методах Python , возможно, это может вас заинтересовать. (фиксированная ссылка) – Rik Poggi 29 January 2012 в 13:33
  • 3
    @RikPoggi Вы на самом деле не говорите, почему __get__, когда у нас есть __getattr__ или наоборот. ответ, который вы упомянули для обоих, одинаковы – overexchange 2 June 2017 в 11:16
  • 4
    Спасибо за примеры и ссылку на документы. Было бы неплохо четко указать, как мы получаем от AttributeError до __getattr__ в # comment, и, возможно, также, что, в отличие от __setattr__ и __getattribute__, __getattr__ вызывается только в том случае, если имя не определено, или через AttributeError. По крайней мере, это мое понимание. – Julian 2 October 2017 в 12:39
Другие вопросы по тегам:

Похожие вопросы: