Минимальный пример
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
- это элемент, который прослушивал к событию Документация по каждому указанному вами методу легко достижима из индекса документации .
В любом случае это может быть немного расширенной ссылкой:
__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
Надеюсь, этого достаточно, чтобы дать вам общую идею.
__get__
и__set__
должны быть определены в атрибутах i>, а не в классе! Я все еще думаю, что все методы в моем оригинальном посте могут делать с более дифференцируемыми именами, но я внезапно чувствую себя намного менее подавленным. Спасибо. ☺ – Zearin 29 January 2012 в 03:18__get__
, когда у нас есть__getattr__
или наоборот. ответ, который вы упомянули для обоих, одинаковы – overexchange 2 June 2017 в 11:16AttributeError
до__getattr__
в# comment
, и, возможно, также, что, в отличие от__setattr__
и__getattribute__
,__getattr__
вызывается только в том случае, если имя не определено, или черезAttributeError
. По крайней мере, это мое понимание. – Julian 2 October 2017 в 12:39