Как я могу проверить, перезаписана ли одна переменная класса? [Дубликат]

Facebook построил нечто, называемое Расширенное управление трафиком . Краткое описание с их страницы GitHub:

Расширенное управление трафиком (ATC) - это инструмент для моделирования условий сети. Он позволяет управлять подключением устройства к Интернету. Разработчики могут использовать ATC для тестирования своего приложения в разных условиях сети, легко подражая высокоскоростным, мобильным и даже сильно поврежденным сетям. Аспекты подключения, которые можно контролировать, включают в себя:

  • полоса пропускания
  • латентность
  • потеря пакетов
  • поврежденные пакеты
  • ]
  • заказы пакетов

Чтобы иметь возможность формировать сетевой трафик, ATC должен работать на устройстве, которое направляет трафик и видит реальный IP-адрес устройства, например например, ваш сетевой шлюз. Это также позволяет любым устройствам, проходящим через ATC, иметь возможность формировать свой трафик. Трафик может быть сформирован / неформован с использованием веб-интерфейса, позволяющего любым устройствам с веб-браузером использовать ATC без необходимости в клиентском приложении.

Вы можете найти его здесь, на GitHub: https://github.com/facebook/augmented-traffic-control

Они также опубликовали сообщение в блоге об этом: https://code.facebook.com/posts / 1561127100804165 / дополненный трафик управление-а-инструмент к-Simulate-сеть-условие /

62
задан Salvador Dali 21 April 2015 в 22:25
поделиться

4 ответа

Как отмечали другие, они используют функцию языка, называемую дескрипторами.

Причина, по которой объект фактического объекта возвращается при доступе к нему через класс Foo.hello, заключается в том, как свойство реализует __get__(self, instance, owner) специальный способ. Если дескриптор обращается к экземпляру , то этот экземпляр передается как соответствующий аргумент, а owner является классом этого экземпляра.

С другой стороны, если к нему обращаются через класс, то instance является None и пропускается только owner. Объект property распознает это и возвращает self.


Кроме дескрипторов , как , см. Также документацию по Реализация дескрипторов и Вызов дескрипторов в Руководстве по языку.

39
ответ дан Bak Itzik 15 August 2018 в 19:32
поделиться

Объект property просто реализует протокол дескриптора: http://docs.python.org/howto/descriptor.html

3
ответ дан Achim 15 August 2018 в 19:32
поделиться
  • 1
    В этом случае я, конечно, понимаю рассуждения по поводу dw, и этот ответ, и тот, который принят, лишены объяснения real и являются в основном ссылками. Хотя этого достаточно в некоторых случаях решения проблем, похоже, OP искал человеческое объяснение по этому вопросу. – Morgan Wilde 28 May 2013 в 01:07

Свойства - дескрипторы , а дескрипторы ведут себя особенно в случае члена экземпляра класса. Короче говоря, если a является экземпляром типа A, а A.foo является дескриптором, то a.foo эквивалентен A.foo.__get__(a).

10
ответ дан Sven Marnach 15 August 2018 в 19:32
поделиться
  • 1
    Собственно, они также работают со старым стилем (в Python 2.7). Но спасибо за ссылку, прочитаю. – Fred Foo 31 May 2011 в 22:14
  • 2
    Обратите внимание, что сигнатура метода для __get__() неверна. У него есть два аргумента (в дополнение к себе). Иначе хорошо объяснил. – Tim Yates 31 May 2011 в 22:18
  • 3
    @larsmans: со связанной страницы: & quot; Обратите внимание, что дескрипторы вызываются только для новых объектов или классов стиля. & quot; Я также помню, что однажды попробовал их для классов старого стиля. – Sven Marnach 31 May 2011 в 22:19
  • 4
    @Tim: второй аргумент является необязательным. – Sven Marnach 31 May 2011 в 22:20
  • 5
    @larsmans: Я сделал несколько быстрых тестов. Тип самого дескриптора должен быть классом нового стиля, иначе он не будет работать. Класс, содержащий дескриптор, не имеет значения. Вышеприведенную цитату можно было прочитать в любом случае. – Sven Marnach 31 May 2011 в 22:31

Для правильной работы @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
19
ответ дан Timothy Vann 15 August 2018 в 19:32
поделиться
  • 1
    Для явно , заявляя, что класс должен быть подклассом объекта, чтобы это работало +1 – kaskelotti 8 April 2016 в 03:21
  • 2
    Следует помнить, что с Python 3 наследование от object больше не требуется. – DeFazer 31 July 2016 в 22:47
  • 3
    – Nathaniel Verhaaren 11 September 2018 в 16:02
Другие вопросы по тегам:

Похожие вопросы: