Eine andere Möglichkeit, Klassen zu erweitern (insbesondere neue Methoden hinzuzufügen, vorhandene nicht zu ändern), auch integrierte Klassen, besteht darin, einen Präprozessor zu verwenden, der die Möglichkeit bietet, den Bereich von Python selbst zu erweitern und zu erweitern und die Erweiterung in zu konvertieren normale Python-Syntax, bevor Python sie tatsächlich sieht.
Ich habe dies str()
zum Beispiel getan, um die Klasse von Python 2 zu erweitern . str()
ist ein besonders interessantes Ziel aufgrund der impliziten Verknüpfung mit zitierten Daten wie 'this'
und 'that'
.
Hier ist ein erweiterter Code, bei dem die einzige hinzugefügte Nicht-Python-Syntax das extend:testDottedQuad
Bit ist:
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
Danach kann ich den Code eingeben, der dem Präprozessor zugeführt wird:
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'
Der Präprozessor isst das, spuckt normales Python ohne Monkeypatching aus und Python macht das, was ich beabsichtigt habe.
So wie ein AC-Präprozessor c Funktionen hinzufügt, kann auch ein Python-Präprozessor Python Funktionen hinzufügen.
Meine Präprozessor-Implementierung ist zu groß für eine Stapelüberlauf-Antwort, aber für diejenigen, die interessiert sein könnten, ist sie hier auf GitHub.