Abgeleitete Klasse überschreiben
So wie Du bisher zu verstehen bist, hast Du das folgende vorliegen: „class C(A, B)“, wobei alle drei Klassen schon Code enthalten, der von Dir weder geschrieben wurde, noch gewartet wird. Jetzt hättest Du gerne „class C(D, B)“, wobei D von Dir kommt. Die Autoren von C haben aber keine Ahnung von diesen Änderungen und D kennen sie schon gar nicht. Selbst wenn Dir dieses monkey patching gelingt, wirst Du Dir ein Minenfeld legen.
Gelingen könnte das Monkey-Patching durchaus. Denkbar wäre vorab das Definieren von Funktionen, die "self" und ggf weitere Parameter annehmen. Die Funktionen lassen sich anschließend als Attribute an die Klasse binden und verhalten sich dann wie Methoden. Dass sich der OP damit höchstwahrscheinlich in den Fuß schießt, dürfte aber genau so klar sein. Vielleicht lernt er ja dadurch.
Ich würde weder Quellcode kopieren NOCH von außen in den Innereien einer Bibliothek rumfuhrwerken und mir dabei einreden, ich wäre irgendwie robuster unterwegs. Ein solcher Fall tritt insbesondere in einer Sprache die auf Ducktyping beruht eigentlich gar nicht auf. Warum du glaubst das machen zu müssen, hast du noch nicht dargelegt.Amerika_befreie_uns hat geschrieben: ↑Sonntag 1. Dezember 2019, 05:08 Warum sollte es Unsinn sein etwas wieder zu verwenden was es schon gibt.
Du würdest also denn ganzen Quellcode rauskopieren und Kompatibilitäts Probleme in Kauf nehmen?
Ich brauche diese Klasse/Funktion
3.7/lib/python3.7/importlib/_bootstrap_external.py:
Statt
3.7/lib/python3.7/importlib/_bootstrap_external.py:
Allerdings brauche ich FileLoader als Abgewandelte Form:class SourceFileLoader(FileLoader, SourceLoader):
Statt
brauche ichdef get_data(self, path):
"""Return the data from path as raw bytes."""
with _io.FileIO(path, 'r') as file:
return file.read()
Ich habe es im Moment so gelöst, dass das ich den Quellcode von SourcecodeLoader kopiere und FileLoader mit meiner eigener Klasse ersetzen. Allerdings bin ich nicht damit glücklich.def get_data(self, path):
"""Return the data from path as raw bytes."""
return "Mein Quellcode als Zeichenkette"
Und wieso kannst du nicht einfach SourceFileLoader ableiten & eine Überladung von der Methode machen?
Und wozu machst du das? Es gibt einen offiziellen Weg sowas zu tun - https://docs.python.org/3/library/impor ... n-importer - warum kannst du den nicht beschreiten?
Und wozu machst du das? Es gibt einen offiziellen Weg sowas zu tun - https://docs.python.org/3/library/impor ... n-importer - warum kannst du den nicht beschreiten?
Sie gut aus, wie verwendet man das? Kann ich damit ein Modul aus einer Zeichenkette laden?__deets__ hat geschrieben: ↑Sonntag 1. Dezember 2019, 22:55 Und wieso kannst du nicht einfach SourceFileLoader ableiten & eine Überladung von der Methode machen?
Und wozu machst du das? Es gibt einen offiziellen Weg sowas zu tun - https://docs.python.org/3/library/impor ... n-importer - warum kannst du den nicht beschreiten?
Ja, nach nur wenigen Sekunden googeln findet man zb https://stackoverflow.com/questions/141 ... rom-memory
Funktioniert nicht.__deets__ hat geschrieben: ↑Montag 2. Dezember 2019, 08:13 Ja, nach nur wenigen Sekunden googeln findet man zb https://stackoverflow.com/questions/141 ... rom-memory
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Amerika_befreie_uns: Nach 50 posts hier im Forum sollte dir inzwischen klar sein, dass die Aussage "funktioniert nicht" in keiner Weise dazu beiträgt, dass dir jemand helfen kann. Was heißt "funktioniert nicht"? Ist dein Rechner abgestürtzt? Hat er angefangen zu brennen? Oder hat er Beleidigungen gegen dich ausgestoßen?
In specifications, Murphy's Law supersedes Ohm's.
Dann liest man halt mal nen Stuendchen durch die Dokumentation und portiert das ganze:
Code: Alles auswählen
import importlib
import sys
class CustomDirectSourceImporter:
SOURCE_MODULES = {
"foobar": """def test():
print("test!")"""
}
def find_spec(self, fullname, path, target):
if fullname in self.SOURCE_MODULES:
return importlib.util.spec_from_loader(fullname, self)
return None
def create_module(self, spec):
return None
def exec_module(self, module):
exec(self.SOURCE_MODULES[module.__name__], module.__dict__)
def main():
sys.meta_path.append(CustomDirectSourceImporter())
import foobar
foobar.test()
if __name__ == '__main__':
main()