Там какая-либо причина состоит в том, чтобы выбрать __ новый __ по __ init __ при определении метакласса?

xmlstarlet является инструментом командной строки, который сделает это и больше:

$ xmlstarlet val --help
XMLStarlet Toolkit: Validate XML document(s)
Usage: xmlstarlet val  [  ... ]
where 
  -w or --well-formed        - validate well-formedness only (default)
  -d or --dtd      - validate against DTD
  -s or --xsd      - validate against XSD schema
  -E or --embed              - validate using embedded DTD
  -r or --relaxng  - validate against Relax-NG schema
  -e or --err                - print verbose error messages on stderr
  -b or --list-bad           - list only files which do not validate
  -g or --list-good          - list only files which validate
  -q or --quiet              - do not list files (return result code only)

NOTE: XML Schemas are not fully supported yet due to its incomplete
      support in libxml2 (see http://xmlsoft.org)

XMLStarlet is a command line toolkit to query/edit/check/transform
XML documents (for more information see http://xmlstar.sourceforge.net/)

Использование в Вашем случае было бы вроде:

xmlstarlet val --xsd your_schema.xsd your_file.xml

40
задан Jason Baker 3 December 2009 в 15:32
поделиться

3 ответа

Если вы хотите изменить атрибуты dict до создания класса или изменить базовый кортеж, вы должны использовать __ new __ . К тому времени, когда __ init __ увидит аргументы, объект класса уже существует. Кроме того, вы должны использовать __ new __ , если хотите вернуть что-то, кроме вновь созданного класса рассматриваемого типа.

С другой стороны, к моменту выполнения __ init __ класс действительно существует. Таким образом, вы можете делать такие вещи, как давать ссылку на только что созданный класс на один из его объектов-членов.

Edit : изменена формулировка, чтобы прояснить, что под «объектом» я имею в виду класс-объект.

49
ответ дан 27 November 2019 в 01:48
поделиться

Вы можете увидеть полную запись в официальных документах , но в основном, __ new __ называется перед , новый объект создан (с целью его создания) и __ init __ вызывается после того, как создается новый объект (с целью его инициализации).

Использование __ new __ позволяет использовать такие приемы, как кэширование объектов (всегда возвращает один и тот же объект для одних и тех же аргументов, а не создает новые) или создание объектов другого класса, чем запрошенный (иногда используется для возврата более конкретных подклассов запрошенного класса). Обычно, если вы не делаете что-то довольно странное, полезность __ new __ ограничена. Если вам не нужно использовать такие уловки, используйте __ init __ .

4
ответ дан 27 November 2019 в 01:48
поделиться

Вы можете реализовать кэширование. Person («Джек») всегда возвращает новый объект во втором примере, в то время как вы можете искать существующий экземпляр в первом примере с помощью __ new __ (или не возвращать ничего, если хотите).

1
ответ дан 27 November 2019 в 01:48
поделиться
Другие вопросы по тегам:

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