Facebook построил нечто, называемое Расширенное управление трафиком . Краткое описание с их страницы GitHub:
Расширенное управление трафиком (ATC) - это инструмент для моделирования условий сети. Он позволяет управлять подключением устройства к Интернету. Разработчики могут использовать ATC для тестирования своего приложения в разных условиях сети, легко подражая высокоскоростным, мобильным и даже сильно поврежденным сетям. Аспекты подключения, которые можно контролировать, включают в себя:
- полоса пропускания
- латентность
- потеря пакетов
- поврежденные пакеты
]- заказы пакетов
Чтобы иметь возможность формировать сетевой трафик, ATC должен работать на устройстве, которое направляет трафик и видит реальный IP-адрес устройства, например например, ваш сетевой шлюз. Это также позволяет любым устройствам, проходящим через ATC, иметь возможность формировать свой трафик. Трафик может быть сформирован / неформован с использованием веб-интерфейса, позволяющего любым устройствам с веб-браузером использовать ATC без необходимости в клиентском приложении.
Вы можете найти его здесь, на GitHub: https://github.com/facebook/augmented-traffic-control
Они также опубликовали сообщение в блоге об этом: https://code.facebook.com/posts / 1561127100804165 / дополненный трафик управление-а-инструмент к-Simulate-сеть-условие /
Как отмечали другие, они используют функцию языка, называемую дескрипторами.
Причина, по которой объект фактического объекта возвращается при доступе к нему через класс Foo.hello
, заключается в том, как свойство реализует __get__(self, instance, owner)
специальный способ. Если дескриптор обращается к экземпляру , то этот экземпляр передается как соответствующий аргумент, а owner
является классом этого экземпляра.
С другой стороны, если к нему обращаются через класс, то instance
является None и пропускается только owner
. Объект property
распознает это и возвращает self
.
Кроме дескрипторов , как , см. Также документацию по Реализация дескрипторов и Вызов дескрипторов в Руководстве по языку.
Объект property
просто реализует протокол дескриптора: http://docs.python.org/howto/descriptor.html
Свойства - дескрипторы , а дескрипторы ведут себя особенно в случае члена экземпляра класса. Короче говоря, если a
является экземпляром типа A
, а A.foo
является дескриптором, то a.foo
эквивалентен A.foo.__get__(a)
.
__get__()
неверна. У него есть два аргумента (в дополнение к себе). Иначе хорошо объяснил.
– Tim Yates
31 May 2011 в 22:18
Для правильной работы @properties класс должен быть подклассом объекта. когда класс не является подклассом объекта, то при первом попытке доступа к установщику он фактически создает новый атрибут с более коротким именем вместо доступа через сеттер.
Неправильно работает следующее:
class C(): # <-- Notice that object is missing
def __init__(self):
self._x = None
@property
def x(self):
print 'getting value of x'
return self._x
@x.setter
def x(self, x):
print 'setting value of x'
self._x = x
>>> c = C()
>>> c.x = 1
>>> print c.x, c._x
1 0
Правильно работает
class C(object):
def __init__(self):
self._x = None
@property
def x(self):
print 'getting value of x'
return self._x
@x.setter
def x(self, x):
print 'setting value of x'
self._x = x
>>> c = C()
>>> c.x = 1
setting value of x
>>> print c.x, c._x
getting value of x
1 1