Следуя ответу Даниэля Вассалло , вот версия, которая имеет дело с проблемой замыкания более простым способом.
Так как все маркеры будут иметь отдельный InfoWindow , и поскольку JavaScript не волнует, добавили ли вы дополнительные свойства к объекту, все, что вам нужно сделать, это добавить InfoWindow в свойства [] маркера , а затем вызвать .open()
на InfoWindow от себя!
Редактирование: при наличии достаточного количества данных, pageload может занимать много времени, поэтому вместо создания InfoWindow с маркером конструкция должна произойти только тогда, когда это необходимо. Обратите внимание, что любые данные, используемые для создания InfoWindow , должны быть добавлены к маркеру как свойство (data
). Также обратите внимание, что после первого события клика infoWindow
будет сохраняться как свойство его маркера, поэтому браузеру не нужно постоянно восстанавливать.
var locations = [
['Bondi Beach', -33.890542, 151.274856, 4],
['Coogee Beach', -33.923036, 151.259052, 5],
['Cronulla Beach', -34.028249, 151.157507, 3],
['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
['Maroubra Beach', -33.950198, 151.259302, 1]
];
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(-33.92, 151.25)
});
for (i = 0; i < locations.length; i++) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(locations[i][1], locations[i][2]),
map: map,
data: {
name: locations[i][0]
}
});
marker.addListener('click', function() {
if(!this.infoWindow) {
this.infoWindow = new google.maps.InfoWindow({
content: this.data.name;
});
}
this.infoWindow.open(map,this);
})
}
Да, если вы хотите отказаться от функции, фактически являющейся функцией.
Сначала определите класс для нашего нового типа:
import functools
class reprwrapper(object):
def __init__(self, repr, func):
self._repr = repr
self._func = func
functools.update_wrapper(self, func)
def __call__(self, *args, **kw):
return self._func(*args, **kw)
def __repr__(self):
return self._repr(self._func)
Добавьте в декоратор function:
def withrepr(reprfun):
def _wrap(func):
return reprwrapper(reprfun, func)
return _wrap
И теперь мы можем определить репер вместе с функцией:
@withrepr(lambda x: "<Func: %s>" % x.__name__)
def mul42(y):
return y*42
Теперь repr(mul42)
создает '<Func: mul42>'
Нет, потому что repr(f)
выполняется как type(f).__repr__(f)
.
Для этого вам нужно будет изменить функцию __repr__
для данного класса, которая в этом случае является встроенным классом функций (types.FunctionType
). Поскольку в Python вы не можете редактировать встроенные классы, только подклассировать их, вы не можете.
Однако есть два подхода, которым вы могли бы следовать:
myrepr
, которая сначала ищет методы __myrepr__
, которую вы не можете добавить в класс функций, но вы можете добавить ее к отдельным объектам функции, как вы предлагаете (а также к вашим пользовательским классам и объектам) , затем по умолчанию будет указано, если __myrepr__
не найден. Возможная реализация для этого будет: def myrepr(x):
try:
x.__myrepr__
except AttributeError:
return repr(x)
else:
return x.__myrepr__()
Затем вы можете определить методы __myrepr__
и использовать функцию myrepr
. Кроме того, вы также можете __builtins__.repr = myrepr
сделать свою функцию по умолчанию repr
и продолжать использовать repr
. Этот подход в конечном итоге сделает именно то, что вы хотите, хотя редактирование __builtins__
может не всегда быть желательным.