Эти люди разработали метод отпечатки пальцев для распознавания пользователя с высоким уровнем точности:
https://panopticlick.eff.org/static/browser-uniqueness.pdf
Мы исследуем степень, в которой современные веб-браузеры подвергаются «отпечатку пальца устройства» через информацию о версии и конфигурации, которую они будут передавать на веб-сайты по запросу. Мы реализовали один возможный алгоритм отпечатка пальца и собрали эти отпечатки пальцев из большого набора браузеров, которые посетили нашу тестовую сторону, panopticlick.eff.org . Мы заметили, что распределение нашего отпечатка пальца содержит не менее 18,1 бит энтропии, а это означает, что если мы выбираем браузер случайным образом, в лучшем случае мы ожидаем, что только один из 286 777 других браузеров поделится своим отпечатком. Среди браузеров, поддерживающих Flash или Java, ситуация хуже, причем средний браузер имеет не менее 18,8 бит идентификационной информации. 94.2% браузеров с Flash или Java были уникальными в нашем примере.
Наблюдая за возвращающимися посетителями, мы оцениваем, как быстро отпечатки пальцев браузера могут со временем меняться. В нашем примере отпечатки пальцев изменились довольно быстро, но даже простая эвристика, как правило, могла угадать, когда отпечаток пальца был «обновленной» версией ранее обнаруженного отпечатка пальца браузера, с 99,1% догадок правильной и ложной положительной скоростью всего 0,86% .
Мы обсуждаем, что на самом деле представляет собой отпечаток пальца для обеспечения конфиденциальности, и какие контрмеры могут быть подходящими для предотвращения этого. Существует компромисс между защитой от отпечатков пальцев и некоторыми видами отладки, которые в современных браузерах сильно зависят от конфиденциальности. Как это ни парадоксально, технологии защиты от отпечатков пальцев могут быть самонадеянными, если они не используются достаточным количеством людей; мы показываем, что некоторые меры по обеспечению конфиденциальности в настоящее время становятся жертвами этого парадокса, но другие не ...
blockquote>
Да, используя декоратор статического метода
class MyClass(object):
@staticmethod
def the_static_method(x):
print(x)
MyClass.the_static_method(2) # outputs 2
Обратите внимание, что некоторый код может использовать старый метод определения статического метода, используя staticmethod
как функцию, а не как декоратор. Это следует использовать только в том случае, если вам необходимо поддерживать древние версии Python (2.2 и 2.3)
class MyClass(object):
def the_static_method(x):
print(x)
the_static_method = staticmethod(the_static_method)
MyClass.the_static_method(2) # outputs 2
. Это полностью идентично первому примеру (используется @staticmethod
), просто не используется синтаксис nice decorator
Наконец, используйте staticmethod ()
экономно! В Python очень мало ситуаций, когда необходимы статические методы, и я видел, как они много раз использовались, когда отдельная функция «верхнего уровня» была бы более понятной.
Ниже дословно из документации: :
Статический метод не получает неявный первый аргумент. Чтобы объявить статический метод, используйте эту идиому:
class C: @staticmethod def f (arg1, arg2, ...): ...
Форма @staticmethod является декоратором функции - подробности см. В описании определений функций в Определения функций .
Его можно вызывать любым классом (например,
Cf ()
) или в другом случае (например,C (). F ()
). Экземпляр игнорируется, за исключением его класса.Статические методы в Python аналогичны тем, которые встречаются в Java или C ++. Для более продвинутой концепции см.
classmethod ()
.Для получения дополнительной информации о статических методах см. Документацию по стандартной иерархии типов в Стандартная иерархия типов .
Новое в версии 2.2.
Изменено в версии 2.4: добавлен синтаксис декоратора функций.
Да, посмотрите декоратор статического метода :
>>> class C:
... @staticmethod
... def hello():
... print "Hello World"
...
>>> C.hello()
Hello World
Вам не нужно использовать декоратор @staticmethod
. Просто объявите метод (не ожидающий параметра self) и вызовите его из класса. Декоратор доступен только в том случае, если вы хотите иметь возможность вызывать его также из экземпляра (что не было тем, что вы хотели делать)
В основном вы просто используете функции ...