อีกวิธีหนึ่งในการขยาย (หมายถึงโดยเฉพาะเพิ่มวิธีการใหม่ไม่เปลี่ยนคลาสที่มีอยู่) แม้กระทั่งคลาสในตัวคือการใช้ตัวประมวลผลล่วงหน้าที่เพิ่มความสามารถในการขยายออกจาก / เหนือขอบเขตของ Python เองโดยแปลงส่วนขยายเป็น ไวยากรณ์ Python ปกติก่อนที่ Python จะเห็นจริง
ฉันได้ทำสิ่งนี้เพื่อขยายstr()
คลาสของ Python 2 เป็นต้น 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