Python: var установлен в __init__ недоступен [дубликат]

Вам нужно только минимальное изменение; одинарная кавычка разделителя здесь-документа после <<.

cat <<'EOF' >> brightup.sh

или эквивалентно обратная косая черта-escape it:

cat <<\EOF >>brightup.sh

Без цитирования здесь документ будет подвергаться переменной замене , backticks будут оцениваться и т. д., как вы обнаружили.

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

cat <>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF

будет производить

#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"

. Как предложено @fedorqui , вот соответствующий раздел из man bash:

Здесь Документы

Этот тип перенаправления инструктирует оболочку читать входные данные от текущего источника до тех пор, пока не появится строка, содержащая только разделитель (без конечных пробелов). Все строки, считываемые до этой точки, затем используются в качестве стандартного ввода для команды.

Формат здесь-документов:

      <<[-]word
              here-document
      delimiter

Нет расширения параметров, команда подстановка, арифметическое расширение или расширение пути по слову. Если какие-либо символы в слове цитируются, разделитель является результатом удаления цитаты в слове, а строки в этом документе не будут расширены. Если слово без кавычек, все строки этого документа подвергаются расширению параметров, подстановке команд и арифметическому расширению. В последнем случае последовательность символов \ игнорируется, а \ должна использоваться для цитирования символов \, $ и `.

blockquote>

28
задан Martijn Pieters 12 May 2014 в 17:00
поделиться

2 ответа

ключевые слова с шаблоном __ * являются частными именами классов.

http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers

Цитата:

Имена этой категории, используемые в контексте определения класса, переписываются, чтобы использовать искаженную форму, чтобы избежать конфликтов имен между «частными» атрибутами базового и производного классов

Частное имя mangling (выделено мной):

Управление частным именем: когда идентификатор, который имеет текстовое значение в определение класса начинается с двух или более символов подчеркивания и не заканчивается двумя или более символами подчеркивания, оно считается частным именем этого класса. Частные имена преобразуются в более длинную форму до того, как для них генерируется код. Преобразование вставляет имя класса перед именем, с удалением ведущих подчеркиваний и одним подчеркиванием, вставленным перед именем класса. Например, идентификатор __spam, входящий в класс с именем Ham, будет преобразован в _Ham__spam. Это преобразование не зависит от синтаксического контекста, в котором используется идентификатор. Если преобразованное имя чрезвычайно длинное (длиннее 255 символов), может быть реализовано определенное усечение. Если имя класса состоит только из символов подчеркивания, преобразование не выполняется.

http://docs.python.org/reference/expressions.html#atom-identifiers

Это означает, что за кулисами B.__a() преобразуется в нечто вроде B._B__a()

31
ответ дан Sean 27 August 2018 в 09:23
поделиться
In [1]: class A(object):
...:     def __init__(self):
...:         self.a()
...:     def a(self):
...:         print "A.a()"
...:
...:     __str__ = a
...:         

In [2]: class B(A):
...:     def __init__(self):
...:         super(B, self).__init__()
...:     def a(self):
...:         print "B.a()"
...:         
...:         

In [3]: b = B()
        print str(b)
   A.a()

Вам нужно будет снова объявить __str__ в B.

0
ответ дан Marko 27 August 2018 в 09:23
поделиться
Другие вопросы по тегам:

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