如何在python中扩展一个类?

How to extend a class in python?

在Python中,如何扩展类?例如,如果我有

颜色.py

1
2
3
4
5
class Color:
    def __init__(self, color):
        self.color = color
    def getcolor(self):
        return self.color

颜色扩展.py

1
2
3
4
5
import Color

class Color:
    def getcolor(self):
        return self.color +" extended!"

但这不管用…我希望如果我在color_extended.py中工作,那么当我制作一个颜色对象并使用getcolor函数时,它将返回字符串为"extended"的对象。最后。另外,它还应该从导入中获取init。

假设python 3.1

谢谢


用途:

1
2
3
4
import color

class Color(color.Color):
    ...

如果这是python 2.x,您还需要从object派生color.Color,使其成为一个新的样式类:

1
2
class Color(object):
    ...

这在python 3.x中是不必要的。


扩展类(特别是添加新方法,而不是更改现有方法)的另一种方法,甚至是内置的方法,是使用一个预处理器,它添加了扩展到/超出Python本身范围的能力,在Python真正看到它之前将扩展转换为普通的Python语法。

例如,我这样做是为了扩展python 2的str()类。由于与引用数据(如'this''that'的隐式链接,str()是一个特别有趣的目标。

下面是一些扩展代码,其中唯一添加的非python语法是extend:testDottedQuad位:

1
2
3
4
5
6
7
8
9
10
11
extend:testDottedQuad
def testDottedQuad(strObject):
    if not isinstance(strObject, basestring): return False
    listStrings = strObject.split('.')
    if len(listStrings) != 4: return False
    for strNum in listStrings:
        try:    val = int(strNum)
        except: return False
        if val < 0: return False
        if val > 255: return False
    return True

在此之后,我可以将输入到预处理器的代码写入:

1
2
3
4
5
6
7
8
9
10
if '192.168.1.100'.testDottedQuad():
    doSomething()

dq = '216.126.621.5'
if not dq.testDottedQuad():
    throwWarning();

dqt = ''.join(['127','.','0','.','0','.','1']).testDottedQuad()
if dqt:
    print 'well, that was fun'

预处理器吃了这个,吐出普通的没有monkeypatching的python,python做了我想做的。

正如C预处理器向C添加功能一样,python预处理器也可以向python添加功能。

我的预处理器实现对于堆栈溢出答案来说太大了,但是对于那些可能感兴趣的人来说,它在Github上。