Python & amp; Подпроцесс - Мониторинг процесса без блокировки

В следующем я предполагаю, что вас интересует только то, почему Object.create является предпочтительным для настройки наследования.

Чтобы понять преимущества, давайте сначала проясним, что такое «класс» в JavaScript. У вас есть две части:

  1. Функция конструктора. Эта функция содержит всю логику для создания экземпляра «класса», то есть конкретного кода.
  2. Объект прототипа. Это объект, наследуемый экземпляром.

Наследование устанавливает отношение is-a , например, Dog - a Animal. Как это выражается в терминах функции-конструктора и объекта-прототипа?

Очевидно, что собака должна иметь те же методы, что и животное, то есть объект Dog prototype должен каким-то образом включать методы из прототипа Animal . Существует несколько способов сделать это. Вы часто увидите это:

Dog.prototype = new Animal();

Это работает, потому что экземпляр Animal наследуется от объекта Animal прототипа . Но это также означает, что каждая собака наследует от один специфический экземпляр Animal . Кажется, это немного странно. Может ли конкретный код экземпляра запускаться только в функции конструктора ? Внезапно экземпляр специфический код и прототип методы кажутся смешанными.

Мы фактически не хотим запускать экземпляр Animal в этот момент, нам нужны только все методы из объекта Animal prototype . Это позволяет нам Object.create:

Dog.prototype = Object.create(Animal.prototype);

Здесь мы , а не , создаем новый экземпляр Animal, получаем только прототипы. Конкретный код экземпляра экземпляра выполняется точно там, где он должен быть, внутри конструктора:

function Dog() { 
   Animal.call(this, 'Dog'); 
}

Самое большое преимущество заключается в том, что Object.create всегда будет Работа. Использование new Animal() работает только в том случае, если конструктор не ожидает никаких аргументов. Представьте, если конструктор выглядел так:

function Animal(name) { 
    this.name = name.toLowerCase();
}

Вам всегда нужно передать строку в Animal, иначе вы получите сообщение об ошибке. Что вы пройдете, когда будете делать Dog.prototype = new Animal(??);? На самом деле не имеет значения, какую строку вы передаете, если передать что-то , которое, надеюсь, покажет вам, что это плохой дизайн.


Некоторые говорят, что Dog.prototype = Animal.prototype; также может работать. Итак, теперь я полностью смущен

blockquote>

Все, что «добавляет» свойства от Animal.prototype до Dog.prototype, «будет работать». Но решения имеют разное качество. В этом случае у вас будет проблема, что любой метод, который вы добавите в Dog.prototype, также будет добавлен в Animal.prototype.

Пример:

Dog.prototype.bark = function() {
    alert('bark');
};

Поскольку Dog.prototype === Animal.prototype , все экземпляры Animal теперь имеют метод bark, что, конечно же, не то, что вы хотите.

Object.create (и даже new Animal) добавляют один уровень косвенности к наследованию, создавая новый объект, который наследует от Animal.prototype, и этот новый объект становится Dog.prototype.

Наследование в ES6

ES6 вводит новый синтаксис для создания функций-конструкторов и методов прототипа, который выглядит следующим образом:

class Dog extends Animal {

  bark() {
    alert('bark');
  }

}

Это более удобно, чем то, что я объясняется выше, но, как оказалось, extends также использует внутренний эквивалент Object.create для настройки наследования. См. Шаги 2 и 3 в черновике ES6 . Это означает, что использование Object.create(SuperClass.prototype) является «более правильным» подходом в ES5.

2
задан eymas 6 March 2019 в 14:05
поделиться

2 ответа

Я узнал, как управлять подпроцессом с помощью двух операторов if, делая переменную процесса глобальной переменной.

В результате код будет выглядеть следующим образом (набросок):

if command == "run":
    global htop
    htop = subprocess.Popen(["xterm", "-e", "htop"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    if htop.poll() == None:
        htopStatus = "Running"
if command == "stop":
    if htop.poll() == None:
        htop.terminate()
        htopStatus = "Stopped"
0
ответ дан eymas 6 March 2019 в 14:05
поделиться

Используйте p.poll() или, если вам нужно проверить вывод, используйте subprocess.PIPE для стандартного выхода и select() на p.stdout.

0
ответ дан AKX 6 March 2019 в 14:05
поделиться
Другие вопросы по тегам:

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