扩展(特别是意味着,添加新方法,而不更改现有方法)类(甚至是内置类)的另一种方法是使用预处理器,该预处理器添加了扩展功能,使其能够扩展/超出Python本身的范围,并将扩展转换为普通的Python语法,然后才真正看到它。
例如,我这样做是为了扩展Python 2的str()
类。str()
由于引用数据(如'this'
和)的隐式链接,是一个特别有趣的目标'that'
。
这是一些扩展代码,其中唯一添加的非Python语法是extend:testDottedQuad
:
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
之后,我可以编写送入预处理器的代码:
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'
预处理器会吃掉它,吐出普通的Python而不会进行猴子补丁操作,Python会按照我的预期去做。
正如ac预处理器向c添加功能一样,Python预处理器也可以向Python添加功能。
我的预处理器的实施是一个堆栈溢出的答案太大,但对于那些谁可能会感兴趣,它是这里在GitHub上。