Cara lain untuk memperluas (secara khusus artinya, menambahkan metode baru, bukan mengubah yang sudah ada) kelas, bahkan yang sudah ada di dalamnya, adalah dengan menggunakan preprocessor yang menambahkan kemampuan untuk memperluas / di atas cakupan Python itu sendiri, mengubah ekstensi menjadi sintaks Python normal sebelum Python benar-benar melihatnya.
Saya telah melakukan ini untuk memperluas str()
kelas Python 2 , misalnya. str()
adalah target yang sangat menarik karena keterkaitan implisit ke data yang dikutip seperti 'this'
dan 'that'
.
Berikut beberapa kode tambahan, di mana satu-satunya sintaks non-Python yang ditambahkan adalah extend:testDottedQuad
bitnya:
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
Setelah itu saya dapat menulis kode yang diumpankan ke preprocessor:
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'
Preprocessor memakannya, mengeluarkan Python normal tanpa monkeypatching, dan Python melakukan apa yang saya inginkan.
Seperti preprocessor ac yang menambahkan fungsionalitas ke c, begitu juga preprocessor Python dapat menambahkan fungsionalitas ke Python.
Pelaksanaan preprocessor saya terlalu besar untuk jawaban stack overflow, tetapi bagi mereka yang mungkin tertarik, itu adalah di sini di GitHub.