реагировать почему не является допустимым синтаксисом для увеличения состояния компонента класса с ++? [Дубликат]

Одиночное подчеркивание в начале:

У Python нет реальных частных методов, поэтому одно подчеркивание в начале имени метода или атрибута означает, что вы не должны обращаться к этому методу, потому что это не часть API.

class BaseForm(StrAndUnicode):

    def _get_errors(self):
        "Returns an ErrorDict for the data provided for the form"
        if self._errors is None:
            self.full_clean()
        return self._errors

    errors = property(_get_errors)

фрагмент кода, взятый из исходного кода django (django / forms / forms.py). Это означает, что ошибки являются свойством, и это часть модуля, но метод, который это свойство вызывает, _get_errors, является «закрытым», поэтому вы не должны обращаться к нему.

Два подчеркивания в начале:

Это вызывает много путаницы. Его нельзя использовать для создания частного метода. Его следует использовать, чтобы избежать переопределения вашего метода подклассом или доступа к нему случайно. Давайте посмотрим пример:

class A(object):
    def __test(self):
        print "I'm test method in class A"

    def test(self):
        self.__test()

a = A()
a.test()

Выход:

$ python test.py
I'm test method in class A

Теперь создайте подкласс B и выполните настройку для метода __test

class B(A):
    def __test(self):
        print "I'm test method in class B"

b = B()
b.test()

Выход будет be ....

$ python test.py
I'm test method in class A

Как мы видели, A.test () не называл методы B .__ test (), как и следовало ожидать. Но на самом деле это правильное поведение для __. Поэтому, когда вы создаете метод, начинающийся с __, это означает, что вы не хотите, чтобы кто-либо мог его переопределить, он будет доступен только изнутри собственного класса.

Два подчеркивания в начале и в начале в конце:

Когда мы видим такой метод, как __this__, не называйте его. Потому что это означает, что это метод, который питон звонит, а не вы. Давайте посмотрим:

>>> name = "test string"
>>> name.__len__()
11
>>> len(name)
11

>>> number = 10
>>> number.__add__(40)
50
>>> number + 50
60

Всегда есть оператор или нативная функция, которая вызывает эти магические методы. Иногда это просто вызовы с пинтовыми вызовами в определенных ситуациях. Например, __init__() вызывается, когда объект создается после вызова __new__() для сборки экземпляра ...

Давайте возьмем пример ...

class FalseCalculator(object):

    def __init__(self, number):
        self.number = number

    def __add__(self, number):
        return self.number - number

    def __sub__(self, number):
        return self.number + number



number = FalseCalculator(20)
print number + 10      # 10
print number - 20      # 40

Для подробнее Руководство по PEP-8 поможет больше.

Здесь вы найдете более магические методы в python. https://github.com/RafeKettler/magicmethods/blob/master/magicmethods.pdf

4
задан Blender 27 June 2012 в 02:48
поделиться

3 ответа

PostIncrement (переменная ++) & amp; PostDecrement (variable -)

Когда вы используете оператор ++ или -- после переменной, значение переменной не увеличивается или уменьшается до тех пор, пока выражение не будет оценено и исходное значение не будет возвращено. Например, x++ преобразуется в нечто похожее на следующее:

document.write(x);
x += 1;

PreIncrement (++ variable) & amp; PreDecrement (- variable)

Когда вы используете оператор ++ или -- до переменной, значение переменной увеличивается или уменьшается до того, как выражение будет оценено, и новое значение будет возвращено. Например, ++x преобразуется в нечто похожее на следующее:

x += 1;
document.write(x);

Операторы postincrement и preincrement доступны в C, C ++, C #, Java, javascript, php, и я уверен, что есть другие языки. Согласно , почему-не-ruby-support-i-or-i-increment-декремент-операторы , Ruby не имеет этих операторов.

11
ответ дан Community 21 August 2018 в 04:56
поделиться
  • 1
    Извините, что вы имеете в виду after заявление? Итак, x ++ не совпадает с x = x + 1, то? – PeanutsMonkey 27 June 2012 в 02:48
  • 2
    Я думаю, что у вас есть это в обратном направлении. ++ перед тем, как прирастить переменную на месте. – Blender 27 June 2012 в 02:49
  • 3
    @Josh Mein - Можете ли вы уточнить, что вы подразумеваете под it is not incremented until after the statement is executed? – PeanutsMonkey 27 June 2012 в 02:51
  • 4
    & quot; После выполнени инструкции & quot; звучит подозрительно для меня. Инкремент постфиксных операторов происходит сразу после того, как значение присваивается выражению. x = 1; x++ * x++ даст 2. – nhahtdh 27 June 2012 в 02:56
  • 5
    @nhahtdh Оценивается лучший термин, на ваш взгляд? – Josh Mein 27 June 2012 в 03:03

Я думаю об x++ и ++x (неофициально) как это:

x++:

function post_increment(x) {
  return x; // Pretend this return statement doesn't exit the function
  x = x + 1;
}

++x:

function pre_increment(x) {
  x = x + 1;
  return x;
}

Две операции выполняют одно и то же, но они возвращают разные значения:

var x = 1;
var y = 1;

x++; // This returned 1
++y; // This returned 2

console.log(x == y); // true because both were incremented in the end
7
ответ дан Blender 21 August 2018 в 04:56
поделиться

Если вы посмотрите на спецификацию javascript на страницах 70 и 71, вы увидите, как это должно быть реализовано:

Префикс:

  1. Пусть expr является результатом вычисления UnaryExpression.
  2. Выдайте исключение SyntaxError, если все условия истинны: 72 © Ecma International 2011 Тип (expr) - это ссылка IsStrictReference ( expr) true Тип (GetBase (expr)) - это запись среды. GetReferencedName (expr) является либо «eval», либо «arguments»
  3. . Пусть oldValue будет ToNumber (GetValue (expr)).
  4. Пусть newValue является результатом добавления значения от 1 до oldValue, используя те же правила, что и для оператора + (см. 11.6.3).
  5. Вызов PutValue (expr, newValue).
  6. Возврат newValue.

Или проще:

  1. Инкрементное значение
  2. Возвращаемое значение

Postfix:

  1. Пусть lhs является результатом оценки LeftHandSideExpres sion.
  2. Выбросить исключение SyntaxError, если все условия истинны: Type (lhs) is Reference is true IsStrictReference (lhs) is true Тип (GetBase (lhs)) - это запись среды GetReferencedName (lhs) либо «eval» или «arguments»
  3. Пусть oldValue будет ToNumber (GetValue (lhs)).
  4. Пусть newValue является результатом добавления значения 1 в oldValue, используя те же правила как и для оператора + (см. 11.6.3).
  5. Вызов PutValue (lhs, newValue).
  6. Возвращает oldValue.
< / blockquote>

Или проще:

  1. Назначить значение темп
  2. Инкрементное значение
  3. Температура возврата
4
ответ дан Dan Busha 21 August 2018 в 04:56
поделиться
Другие вопросы по тегам:

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