Одиночное подчеркивание в начале:
У 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
Когда вы используете оператор ++
или --
после переменной, значение переменной не увеличивается или уменьшается до тех пор, пока выражение не будет оценено и исходное значение не будет возвращено. Например, x++
преобразуется в нечто похожее на следующее:
document.write(x);
x += 1;
Когда вы используете оператор ++
или --
до переменной, значение переменной увеличивается или уменьшается до того, как выражение будет оценено, и новое значение будет возвращено. Например, ++x
преобразуется в нечто похожее на следующее:
x += 1;
document.write(x);
Операторы postincrement и preincrement доступны в C, C ++, C #, Java, javascript, php, и я уверен, что есть другие языки. Согласно , почему-не-ruby-support-i-or-i-increment-декремент-операторы , Ruby не имеет этих операторов.
Я думаю об 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
Если вы посмотрите на спецификацию javascript на страницах 70 и 71, вы увидите, как это должно быть реализовано:
Префикс:
blockquote> blockquote>
- Пусть expr является результатом вычисления UnaryExpression.
- Выдайте исключение SyntaxError, если все условия истинны: 72 © Ecma International 2011 Тип (expr) - это ссылка IsStrictReference ( expr) true Тип (GetBase (expr)) - это запись среды. GetReferencedName (expr) является либо «eval», либо «arguments»
- . Пусть oldValue будет ToNumber (GetValue (expr)).
- Пусть newValue является результатом добавления значения от 1 до oldValue, используя те же правила, что и для оператора + (см. 11.6.3).
- Вызов PutValue (expr, newValue).
- Возврат newValue.
Или проще:
- Инкрементное значение
- Возвращаемое значение
Postfix:
blockquote> < / blockquote>
- Пусть lhs является результатом оценки LeftHandSideExpres sion.
- Выбросить исключение SyntaxError, если все условия истинны: Type (lhs) is Reference is true IsStrictReference (lhs) is true Тип (GetBase (lhs)) - это запись среды GetReferencedName (lhs) либо «eval» или «arguments»
- Пусть oldValue будет ToNumber (GetValue (lhs)).
- Пусть newValue является результатом добавления значения 1 в oldValue, используя те же правила как и для оператора + (см. 11.6.3).
- Вызов PutValue (lhs, newValue).
- Возвращает oldValue.
Или проще:
- Назначить значение темп
- Инкрементное значение
- Температура возврата
after
заявление? Итак, x ++ не совпадает с x = x + 1, то? – PeanutsMonkey 27 June 2012 в 02:48++
перед тем, как прирастить переменную на месте. – Blender 27 June 2012 в 02:49it is not incremented until after the statement is executed
? – PeanutsMonkey 27 June 2012 в 02:51x = 1; x++ * x++
даст 2. – nhahtdh 27 June 2012 в 02:56