2016-10-05 1 views
0

私はPythonでdocxライブラリを使用しています。DocumentクラスのサブクラスNewStyleDocdocxから作成したいと考えていました。 Pythonで関数を 'サブクラス化'していますか?

from docx import Document 
class NewStyleDocument(Document): 
    # stuff 

そして私は、エラーを受け取った:私は次のようにこれを行うことを試み

TypeError: function() argument 1 must be code, not str 

Documentは実際には関数であることを意味します。 (私はtype(Document)とこれを確認しました)私の質問は:Documentのすべてのプロパティを継承するクラスを定義できますか?私の究極の目標は簡単です:私はただしたい:

doc = NewStyleDocument() 

といくつかのカスタムフォントがあります。 (通常、新しい文書を作成するたびにスタイルを変更する必要があります)もっと簡単な方法がありますか?

+0

、それが実際に機能である場合は、[装飾](https://wiki.python.org/moin/PythonDecoratorsを)必要があるかもしれません。 – Rockybilly

+2

'Document'関数によって返されるオブジェクトの型を決定し、その代わりにサブクラス化してみてください。 – Kevin

+6

新しい関数の元の関数を呼び出して結果を修正するだけです。または、古い関数がクラスのインスタンスを返す場合は、* that *をサブクラス化します。 –

答えて

2

docx.Documentなど)最も簡単な方法は、ファクトリ関数のように見えるだけで、それが必要なものをやらせるために、おそらくですあなたが繰り返し、そしてその周りにラップしないために:

from docx import Document 

def NewStyleDocument(docx=None): 
    document = Document(docx) 
    document.add_heading('Document Title', 0) 
    return document 

mydoc = NewStyleDocument() 
+0

これは私のためのトリックでした。私は 'docx = None'が不可欠であることを知っていますが、私はなぜそれがわかりません。 – Jason

+1

@Jason [Martijn投稿](https://github.com/python-openxml/python-docx/blob/master/docx/api.py#L17-L29)のコードを見ると、それはファクトリ関数です。ここでやっていることは、同じシグネチャを持つ別のファクトリ関数を作成して元のオブジェクトを呼び出し、そのオブジェクトを変更する必要があるものを呼び出した後、それを再度返します...継承ではなく、コードを掘り下げなくてはならなくても...ああ...:) –

+1

@ Jasonはそれについて考えています - 'Def NewStyleDocument(* args、** kwargs)'を使って 'Document(* args、** kwargs)'を呼び出すことで、おそらくこの場合の問題ではないかもしれませんが、APIが変更される場合は... –

0

これはドキュメントに記載されています。あなたの問題は、オブジェクトにではなく、モジュールに組み込まれたコンストラクタを使用しているようです。

Document objects¶ 
    class docx.document.Document[source] 

    WordprocessingML (WML) document. Not intended to be constructed directly. Use docx.Document() to open or create a document. 

ですから、そこに別の層(Docx.document.Document)を追加する必要が

関連する問題