2016-10-05 34 views
0

我可以用Python的docx圖書館工作,我是希望從docx創建Document類的子類NewStyleDoc。我試圖做到這一點,如下所示:在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

只需從新函數調用原始函數,即可修改結果。或者,如果舊函數返回一個類的實例,則子類*即*。 –

回答

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如果你看一下代碼[馬亭轉貼](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)