В чем разница между @staticmethod и @classmethod в Python?
blockquote>Возможно, вы видели код Python, такой как этот псевдокод, который демонстрирует подписи различных типов методов и дает объяснение каждому из них:
class Foo(object): def a_normal_instance_method(self, arg_1, kwarg_2=None): ''' Return a value that is a function of the instance with its attributes, and other arguments such as arg_1 and kwarg2 ''' @staticmethod def a_static_method(arg_0): ''' Return a value that is a function of arg_0. It does not know the instance or class it is called from. ''' @classmethod def a_class_method(cls, arg1): ''' Return a value that is a function of the class and other arguments. respects subclassing, it is called with the class it is called from. '''
Метод Normal Instance
Сначала я объясню
a_normal_instance_method
. Это точно называется «методом экземпляра». Когда используется метод экземпляра, он используется как частичная функция (в отличие от общей функции, определенной для всех значений при просмотре в исходном коде), которая при использовании первая из аргументов предопределена как экземпляр объект со всеми его атрибутами. Он имеет экземпляр связанного с ним объекта и должен вызываться из экземпляра объекта. Как правило, он будет обращаться к различным атрибутам экземпляра.Например, это экземпляр строки:
', '
, если мы используем метод экземпляра,
join
on эта строка, чтобы присоединиться к другой итерабельной, она, очевидно, является функцией экземпляра, в дополнение к функции итерируемого списка,['a', 'b', 'c']
:>>> ', '.join(['a', 'b', 'c']) 'a, b, c'
Связанные методы
Методы экземпляров могут быть связаны через пунктирный поиск для использования позже.
Например, это связывает метод
str.join
с экземпляром':'
:>>> join_with_colons = ':'.join
И позже мы можем использовать это как функцию, которая уже имеет первый связанный с ней аргумент. Таким образом, он работает как частичная функция экземпляра:
>>> join_with_colons('abcde') 'a:b:c:d:e' >>> join_with_colons(['FF', 'FF', 'FF', 'FF', 'FF', 'FF']) 'FF:FF:FF:FF:FF:FF'
Статический метод
Статический метод делает не аргумент.
Он очень похож на функцию уровня модуля.
Однако функция модуля должна находиться в модуле и быть специально импортирована в другие места, где она используется.
Если он привязан к объекту, он также будет удобно перемещаться по объекту посредством импорта и наследования.
Примером статического метода является
str.maketrans
, перемещенный из модульstring
в Python 3. Он делает таблицу перевода подходящей для потребленияstr.translate
. Это кажется довольно глупым при использовании из экземпляра строки, как показано ниже, но импорт функции из модуляstring
довольно неуклюжий, и приятно иметь возможность вызвать его из класса, как вstr.maketrans
# demonstrate same function whether called from instance or not: >>> ', '.maketrans('ABC', 'abc') {65: 97, 66: 98, 67: 99} >>> str.maketrans('ABC', 'abc') {65: 97, 66: 98, 67: 99}
В python 2 вам нужно импортировать эту функцию из все более менее полезного строкового модуля:
>>> import string >>> 'ABCDEFG'.translate(string.maketrans('ABC', 'abc')) 'abcDEFG'
Метод класса
Метод класса аналогичен методу экземпляра, поскольку он принимает неявный первый аргумент, но вместо того, чтобы принимать экземпляр, он принимает класс. Часто они используются как альтернативные конструкторы для лучшего семантического использования, и они будут поддерживать наследование.
Самым каноническим примером встроенного метода класса является
dict.fromkeys
.>>> dict.fromkeys(['a', 'b', 'c']) {'c': None, 'b': None, 'a': None}
Когда мы подклассифицируем dict, мы можем использовать тот же самый метод, который был бы использован в качестве альтернативного конструктора dict. конструктор, который создает экземпляр подкласса.
>>> class MyDict(dict): 'A dict subclass, use to demo classmethods' >>> md = MyDict.fromkeys(['a', 'b', 'c']) >>> md {'a': None, 'c': None, 'b': None} >>> type(md)
См. исходный код pandas для других подобных примеров альтернативных конструкторов, а также официальную документацию Python на
classmethod
иstaticmethod
.
Вам нужно добавить dataType - http://api.jquery.com/jQuery.ajax/
$(document).ready(function() {
$("#lesen").click(function() {
$.ajax({
url : "helloworld.txt",
dataType: "text",
success : function (data) {
$(".text").html(data);
}
});
});
});
.load("file.txt")
намного проще. Что работает, но даже при тестировании вы не получите результаты от локального диска, вам понадобится настоящий HTTP-сервер. Невидимая ошибка - ошибка XMLHttpRequest
.
Вы можете использовать метод jQuery load для получения содержимого и вставки в элемент.
Попробуйте следующее:
$(document).ready(function() {
$("#lesen").click(function() {
$(".text").load("helloworld.txt");
});
});
Вы также можете добавьте обратный вызов, чтобы выполнить что-либо после завершения процесса загрузки
, например:
$(document).ready(function() {
$("#lesen").click(function() {
$(".text").load("helloworld.txt", function(){
alert("Done Loading");
});
});
});
<script type="text/javascript">
$("#textFileID").html("Loading...").load("URL TEXT");
</script>
<div id="textFileID"></div>
Вы можете использовать jQuery.load (): http://api.jquery.com/load/
Как это:
$(".text").load("helloworld.txt");
Попробуйте
$(".text").text(data);
Или для преобразования данных, полученных в строку.