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!" |
号
但这不管用…我希望如果我在
假设python 3.1
谢谢
用途:
1 2 3 4 | import color class Color(color.Color): ... |
如果这是python 2.x,您还需要从
1 2 | class Color(object): ... |
号
这在python 3.x中是不必要的。
扩展类(特别是添加新方法,而不是更改现有方法)的另一种方法,甚至是内置的方法,是使用一个预处理器,它添加了扩展到/超出Python本身范围的能力,在Python真正看到它之前将扩展转换为普通的Python语法。
例如,我这样做是为了扩展python 2的
下面是一些扩展代码,其中唯一添加的非python语法是
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上。