У меня есть класс Document, этот класс действительно сложно создать, поэтому у меня есть объект-конструктор для их создания. Оба элемента не мои, поэтому я не могу их изменить
Теперь я хочу создать подкласс Document, просто чтобы добавить некоторые определенные методы. Чтобы продолжать использовать предоставленный конструктор, я попробовал это:
class SpecialDocument(Document):
def __new__(cls, *args):
return DocumentBuilder(*args)
def __init__(self, *args, **kwargs):
#My initialization
Проблема здесь в том, что метод __init__
никогда не выполняется, потому что метод __new__
не возвращает SpecialDocument
(он возвращает Document
)
В моем конкретном случае мне не нужно строить свой SpecialDocument
иначе, чем я строю Document
. Есть ли способ использовать тот же конструктор? Если нет, то как я могу этого добиться? Я просто хочу унаследовать от Document
, чтобы добавить определенные функции, возможно, этого можно было бы достичь с помощью метаклассов, но я никогда их не использовал (вероятно, потому, что я не совсем понимаю это), было бы неплохо немного узнать о них, если это может помочь решить мою проблему. проблема
Document
иDocumentBuilder
? - person Philip Tzou   schedule 19.10.2016DocumentBuilder
— это независимый класс, который возвращает новый объектDocument
, если он построен без параметров, или инициирует свои переменные, если он получает параметр (параметр — это путь к фактическому документу, если он существует) - person Mr. E   schedule 19.10.2016SpecialDocument
, и все они имеют общее поведениеDocument
, но если вы считаете, что делегирование - лучший вариант, я был бы рад принять его. - person Mr. E   schedule 19.10.2016MyBaseDocument
, который содержитDocument
в качестве атрибута и делегирует большую часть функциональности документа, а затем позволяет другим специализированным подклассам наследовать от этого класса. - person Bakuriu   schedule 19.10.2016Document
есть метод с именемwrite_title
, тоMyBaseDocument
понадобится какой-то метод, напримерdef write_title(self, *args): self.document.write_title(*args)
, верно? Я хотел избежать этого, потому что существует множество методов, или есть способ указать интерпретатору Python всегда вызывать метод вself.document
без явного написания его для каждого из них? Возможно, используетсяgetattr
, но это выглядит немного противно - person Mr. E   schedule 19.10.2016__getattr__
. Что-то вродеdef __getattr__(self, name): return lambda *args: getattr(self._document, name)(*args)
могло бы избежать написания подобных методов. Метод__getattr__
вызывается всякий раз, когда кто-то ищет атрибут и атрибут не найден. Если затем подкласс хочет предоставить пользовательскую реализацию, он может просто явно реализовать этот метод. - person Bakuriu   schedule 19.10.2016