Я немного поиграл с super()
и узнал, что мы можем изменить порядок вызова.
Например, у нас есть следующая структура иерархии:
A
/ \
B C
\ /
D
In этот случай MRO of D будет (только для Python 3):
In [26]: D.__mro__
Out[26]: (__main__.D, __main__.B, __main__.C, __main__.A, object)
Давайте создадим класс, где super()
вызывает после выполнения метода.
In [23]: class A(object): # or with Python 3 can define class A:
...: def __init__(self):
...: print("I'm from A")
...:
...: class B(A):
...: def __init__(self):
...: print("I'm from B")
...: super().__init__()
...:
...: class C(A):
...: def __init__(self):
...: print("I'm from C")
...: super().__init__()
...:
...: class D(B, C):
...: def __init__(self):
...: print("I'm from D")
...: super().__init__()
...: d = D()
...:
I'm from D
I'm from B
I'm from C
I'm from A
A
/ ⇖
B ⇒ C
⇖ /
D
Таким образом, мы можем видеть, что порядок разрешения такой же, как в MRO. Но когда мы назовем super()
в начале метода:
In [21]: class A(object): # or class A:
...: def __init__(self):
...: print("I'm from A")
...:
...: class B(A):
...: def __init__(self):
...: super().__init__() # or super(B, self).__init_()
...: print("I'm from B")
...:
...: class C(A):
...: def __init__(self):
...: super().__init__()
...: print("I'm from C")
...:
...: class D(B, C):
...: def __init__(self):
...: super().__init__()
...: print("I'm from D")
...: d = D()
...:
I'm from A
I'm from C
I'm from B
I'm from D
У нас есть другой порядок, он меняет порядок кортежа MRO.
A
/ ⇘
B ⇐ C
⇘ /
D
Для Дополнительное чтение Я бы рекомендовал следующие ответы:
Символ - обратная косая черта \
Из руководства bash :
Символ обратной косой черты '\' может использоваться для удалить любое специальное значение для следующего прочитанного символа и для продолжения строки.
В общем случае вы можете использовать обратную косую черту в конце строки, чтобы команда продолжала переход к следующей строке. Однако есть случаи, когда команды неявно продолжаются, а именно, когда строка заканчивается токеном, чем не может законно прекратить команду. В этом случае оболочка знает, что еще больше, и обратная косая черта может быть опущена. Некоторые примеры:
# In general
$ echo "foo" \
> "bar"
foo bar
# Pipes
$ echo foo |
> cat
foo
# && and ||
$ echo foo &&
> echo bar
foo
bar
$ false ||
> echo bar
bar
Различные, но связанные, являются неявным продолжением внутри кавычек. В этом случае без обратная косая черта, вы просто добавляете новую строку в строку.
$ x="foo
> bar"
$ echo "$x"
foo
bar
С обратная косая черта, вы снова раскалываете логическая строка в несколько логических строк.
$ x="foo\
> bar"
$ echo "$x"
foobar
[[
- ]]
, но не в других, и я пытаюсь выяснить правила.
– Menachem
5 January 2018 в 05:04
\
выполняет эту работу. Ответ Гийома и комментарий Дж. Джорджа четко отвечают на этот вопрос. Здесь я объясняю, почему The backslash has to be the very last character before the end of line character.
Рассмотрим эту команду:
mysql -uroot \ -hlocalhost
Если после \
есть пробел, продолжение строки не будет работать. Причина в том, что \
удаляет особое значение для следующего символа, который является пространством, а не невидимым символом линии. Символ перевода строки находится после пробела, а не \
в этом примере.
^M
. Проблема заключается в том, что сценарий был предоставлен мне тем, кто использует окна. Быстрыйdos2unix
исправил это :) – RyanM 20 October 2013 в 01:04