Методы в Python очень, очень простая вещь, как только Вы поняли основы системы дескриптора. Вообразите следующий класс:
class C(object):
def foo(self):
pass
Теперь позволяют нам взглянуть на тот класс в оболочке:
>>> C.foo
<unbound method C.foo>
>>> C.__dict__['foo']
<function foo at 0x17d05b0>
, Как Вы видите, получаете ли Вы доступ эти foo
атрибут на классе, Вы возвращаете несвязанный метод, однако в устройстве хранения данных класса (dict) существует функция. Почему это? Причина этого состоит в том, что класс Вашего класса реализует __getattribute__
, который разрешает дескрипторы. Комплекс звуков, но не. C.foo
примерно эквивалентно этому коду в том особом случае:
>>> C.__dict__['foo'].__get__(None, C)
<unbound method C.foo>
Поэтому функции имеют __get__
метод, который делает их дескрипторами. Если у Вас есть экземпляр класса, это - почти то же, просто это None
является экземпляром класса:
>>> c = C()
>>> C.__dict__['foo'].__get__(c, C)
<bound method C.foo of <__main__.C object at 0x17bd4d0>>
Теперь, почему Python делает это? Поскольку объект метода связывает первый параметр функции к экземпляру класса. Это - то, куда сам прибывает из. Теперь иногда Вы не хотите, чтобы Ваш класс сделал функцию методом, это - то, где staticmethod
играет роль:
class C(object):
@staticmethod
def foo():
pass
staticmethod
декоратор обертывает Ваш класс и реализует макет __get__
, который возвращает обернутую функцию как функцию и не как метод:
>>> C.__dict__['foo'].__get__(None, C)
<function foo at 0x17d0c30>
Hope, которая объясняет его.
Публикуем это в надежде, что это поможет другим. По крайней мере, начиная с версии 1.8.1 datepicker, использование 'window.DP_jQuery.datepicker' больше не работает, потому что указатель (правильный термин?) Теперь назван с меткой времени его создания - так, например, теперь это будет 'window. DP_jQuery_1273700460448 '. Так что теперь, вместо того, чтобы использовать указатель на объект datepicker, обращайтесь к нему напрямую следующим образом:
$.extend($.datepicker,{_checkOffset:function(inst,offset,isFixed){return offset}});
Большое спасибо за ответ ниже за то, что я получил то, что мне было нужно.
Изменить: JaredC дал обновленный ответ для более поздних версий jQuery выше. Переключение принятого ответа на это.
Хорошо, это вопрос обезьяны, исправляющей функцию, которую она имеет, пытаясь всегда отображать в окне просмотра, поскольку нет возможности включить / отключить эту функцию. К счастью, он отделен и изолирован в одной функции, поэтому мы можем просто войти и переопределить его. Следующий код полностью отключает только эту функцию:
$.extend(window.DP_jQuery.datepicker,{_checkOffset:function(inst,offset,isFixed){return offset}});
_checkOffset вызывается при открытии и выполняет вычисления смещения и возвращает новое смещение, если в противном случае оно было бы вне порта просмотра. Это заменяет тело функции, чтобы просто пропустить исходное смещение. Затем вы можете использовать хак настройки beforeShow и / или класс css .ui-datepicker, чтобы разместить его где угодно.