2012-08-15 74 views
0

例如,是否有可能在不使用繼承

延伸的串類的延伸Python類,使得在打印將與標籤或一些空格前面加上它。然後可以調用它,

print 'hello world' 

當在stdout上看到的時候會在前面加上製表符(空格)。

+0

可能重複:http://stackoverflow.com/questions/972/adding-一種方法到現有的對象 – 2012-08-15 10:05:10

回答

4

是:編輯Python的源代碼。

嚴重:像其他任何編程模型(結構化,面向對象,建模)一樣,Python對你的工作做了一些限制。雖然其中一些可能會感到任意或「愚蠢」,但它們中的每一個都有很好的理由(通常,所有其他解決方案的缺點或過去的錯誤都不能在不破壞所有現有代碼的情況下進行修復)。

當您覺得您需要違規時,退一步考慮一下:也許您的「解決方案」是錯誤的?也許有更好的方法來實現你想要的東西?

在這種情況下,使用格式:

f = '\t%s' 
print f % 'hello world' 

與您的解決方案,這明確地傳達你試圖達到的目標。

也就是說,你可以使用一種技術「monkey patching」。請注意,這種技術是危險的。在大多數情況下,這意味着使用該技術的人不知道他們在做什麼。

+0

它實際上可以猴子補丁內置?當我嘗試將'str .__ str__'分配給別的東西時,我得到'TypeError:不能設置內置/擴展類型'str''的屬性。不是說這是一個好主意 - 我同意你的警告 - 我只是嘗試了一下,並且出於對Python的工作原理的好奇心問。 – Ghopper21 2012-08-15 10:25:37

+1

如果你還沒有迷上舊''%'',我建議你用新的''str.format'](http://docs.python.org/library/string.html#format-examples)格式化。畢竟,這是一個改進的替代品。像這樣:'「\ t {0}」。格式(「hello world」)'。 – 2012-08-15 10:25:38

+0

謝謝,猴子補丁聽起來很有趣。以上只是一個例子,我不想詳細說明我在做什麼。我只是想知道這種語言有什麼可能 – scruffyDog 2012-08-15 10:31:48

3

是否要更改字符串類,或者它只是您想更改的行爲print?如果您:

from __future__ import print_function 

(或使用Python 3),你可以提供自己的print的功能,例如:

def print(*line, **kwargs): 

    args = dict(sep=' ', end='\n', file=None) 
    args.update(kwargs) 

    sep = args['sep'] 
    end = args['end'] 
    file = args['file'] 

    newlist = []; 

    for userln in line: 
     newlist.append("\t"+userln) # prefix the line with a tab 

    if file == None: 
     file = sys.stdout 

    __builtin__.print(sep.join(newlist),end=end,file=file) 
+0

我認爲這只是一個例子,他提出了一個關於擴展Python類的不同可能性的更一般的問題。 – CODe 2012-08-15 12:37:10

相關問題