是否可以在不使用继承的情况下扩展Python类

时间:2012-08-15 10:01:17

标签: python class inheritance io monkeypatching

例如,

扩展字符串类,以便打印它时会在其前面添加制表符或一些空格。然后能够用,

来调用它
print 'hello world'

当在标准输出上看到的时候会有标签(白色空格)。

2 个答案:

答案 0 :(得分:4)

是:编辑Python的源代码。

说真的:像任何其他编程模型(结构化,OO,建模)一样,Python对你可以做的事情施加了一些限制。虽然其中一些可能感到任意或“愚蠢”,但每个人都有充分的理由(通常,所有其他解决方案的缺点或过去的错误,如果不破坏所有现有代码,就无法修复) )。

当你觉得你需要违反规则时,退一步考虑一下:也许你的“解决方案”是错的?也许有更好的方法来实现你想要的东西?

在这种情况下,请使用格式:

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

与您的解决方案不同,它明确地传达了您尝试实现的目标。

也就是说,您可以使用“monkey patching”使用的技术。请注意,这种技术很危险。在大多数情况下,这意味着使用该技术的人不知道他们在做什么。

答案 1 :(得分: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)