NameError с переменной класса [duplicate]

Подробный анализ и десять различных способов изменения строки и их характеристик производительности.

http://eddmann.com/posts/ten-ways-to-reverse-a-string- in-javascript /

Эффективность этих реализаций:

Лучшая реализация (-ы) для каждого браузера

  • Хром 15 - Реализации 1 и 6
  • Firefox 7 - Реализация 6
  • IE 9 - Реализация 4
  • Opera 12 - Реализация 9

Здесь эти реализации:

Реализация 1:

function reverse(s) {
  var o = '';
  for (var i = s.length - 1; i >= 0; i--)
    o += s[i];
  return o;
}

Реализация 2:

function reverse(s) {
  var o = [];
  for (var i = s.length - 1, j = 0; i >= 0; i--, j++)
    o[j] = s[i];
  return o.join('');
}

Реализация 3:

function reverse(s) {
  var o = [];
  for (var i = 0, len = s.length; i <= len; i++)
    o.push(s.charAt(len - i));
  return o.join('');
}

Реализация 4:

function reverse(s) {
  return s.split('').reverse().join('');
}

Реализация 5:

function reverse(s) {
  var i = s.length,
      o = '';
  while (i > 0) {
    o += s.substring(i - 1, i);
    i--;
  }
  return o;
}

Реализация 6:

function reverse(s) {
  for (var i = s.length - 1, o = ''; i >= 0; o += s[i--]) { }
  return o;
}

Реализация 7:

function reverse(s) {
  return (s === '') ? '' : reverse(s.substr(1)) + s.charAt(0);
}

Реализация 8:

function reverse(s) {
  function rev(s, len, o) {
    return (len === 0) ? o : rev(s, --len, (o += s[len]));
  };
  return rev(s, s.length, '');
}

Реализация 9:

function reverse(s) {
  s = s.split('');
  var len = s.length,
      halfIndex = Math.floor(len / 2) - 1,
      tmp;


     for (var i = 0; i <= halfIndex; i++) {
        tmp = s[len - i - 1];
        s[len - i - 1] = s[i];
        s[i] = tmp;
      }
      return s.join('');
    }

Реализация 10

function reverse(s) {
  if (s.length < 2)
    return s;
  var halfIndex = Math.ceil(s.length / 2);
  return reverse(s.substr(halfIndex)) +
         reverse(s.substr(0, halfIndex));
}

30
задан Jeff O'Neill 6 September 2010 в 02:34
поделиться

2 ответа

В Python тело класса выполняется в своем собственном пространстве имен до создания класса (после чего члены этого пространства имен становятся членами класса). Поэтому, когда интерпретатор достигает y = x + 1, класс B еще не существует в этой точке и, следовательно, не имеет родителя.

Для получения дополнительной информации см. http: //docs.python .org / ссылка / compound_stmts.html # класс-определение

24
ответ дан Nathan Davis 20 August 2018 в 11:09
поделиться

Правила панорамирования Python для barenames очень просты и понятны: сначала локальное пространство имен, затем (если есть) внешние функции, в которых текущий вложен, затем глобальные, наконец, встроенные. Это все, что когда-либо случается, когда открывается barename, и нет необходимости запоминать или применять какие-либо сложные правила (и нет никакой необходимости, чтобы компилятор Python применял более сложные правила).

Каждый раз, когда вы хотите другой поиск, вы будете использовать квалифицированное имя, а не простое имя. Квалифицированные имена значительно более мощные, потому что поиск всегда может быть делегирован объектам, чьи атрибуты могут быть запрошены, и этот объект может реализовать любые правила поиска, в которых они нуждаются. В частности, в методе экземпляра внутри класса self.x есть способ запросить объект self для поиска имени атрибута 'x' - и в этом поиске он может делегировать классы , включая реализацию концепции наследования (и множественного наследования, порядка разрешения метода и т. д.).

Тело класса (в отличие от тел методы, определенные в классе) выполняется как часть оператора class, прежде чем объект класса будет создан или его имя привязано (в частности, прежде чем любая из баз будет определена как основание), хотя эта последняя деталь никогда не может

Итак, в вашем примере, в классе B, barename x просматривается с помощью универсальных правил - это имя связано локально? Если нет, то он связан в любой внешней функции, в которой этот объем вложен? Если нет, то он связан как глобальный или встроенный? Если ни одно из вышеперечисленных вопросов, использующее указанное имя barename, не вызывает исключения из-за ошибки имени.

Поскольку вы хотите, чтобы другая последовательность поиска, чем правила поиска в barename, универсально соблюдались, тогда, очевидно, вам нужно использовать квалифицированный имя, а не barename; и мгновенное отражение ясно покажет, что «один очевидный выбор» для квалифицированного имени, используемого для вашей цели, должен быть A.x - так как вы хотите , чтобы он был поднят ( базы не были записаны нигде еще в этой точке, в конце концов ... это будет метакласс, обычно type, который будет делать привязки баз как часть своей работы, когда он получает после выполняется тело класса! -).

Некоторые люди так остро привязаны к другим «магическим» правилам поиска барменов, которые они просто не могут выдержать этот аспект Python (изначально вдохновленный, по-моему, Modula-3, малоизвестный язык, который очень хорошо рассмотрен в кругах теоретиков ;-) - нужно написать self.x в методе, чтобы указать, что x должно быть посмотрел на self, вместо того, чтобы использовать универсальные правила barename, например, диски таких людей, батты.

Мне нравится простота и универсальность правил поиска barename, и мне нравится использовать квалифицированный nam es вместо barenames в любое время, когда я хочу любой другой формы поиска ... но тогда не секрет, что я безумно люблю Python (у меня есть свои собственные ворчания - например, global x, поскольку инструкция всегда заставляет сканирование моего сайта, где я бы скорее написал global.x, т. е. global было встроенным именем для «текущего исполняемого модуля» ... Мне нравятся квалифицированные имена! -), это? -)

47
ответ дан Alex Martelli 20 August 2018 в 11:09
поделиться
  • 1
    Вау, спасибо за супер подробный ответ! – Jeff O'Neill 6 September 2010 в 14:44
  • 2
    @ Джефф, пожалуйста. – Alex Martelli 6 September 2010 в 15:45
  • 3
    Но что, если ваш подкласс имеет цепочку суперклассов? Тогда квалифицированное имя требует, чтобы вы знали, в каком суперклассе задана переменная класса. Конечно, я вижу случаи, когда это требование делает вещи более безопасными, но также и в некоторых случаях, когда это ограничение. Похоже, было бы неплохо иметь эквивалент «супер» для переменных класса. – Adam Spiers 13 February 2012 в 19:40
  • 4
    Однако было бы довольно естественным, чтобы ИМО имел возможность использовать классы, переданные в качестве аргументов & quot; в круглых скобках в теле определения класса. Например: class B(super=A): y = super.x + 1. (Я знаю о магической силе функции super, я в ужасе от нее.) – Alexey 23 February 2018 в 20:41
Другие вопросы по тегам:

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