Abgeleitete Klasse überschreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

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 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.
anonym44

Ich brauche diese Klasse/Funktion
3.7/lib/python3.7/importlib/_bootstrap_external.py:
class SourceFileLoader(FileLoader, SourceLoader):
Allerdings brauche ich FileLoader als Abgewandelte Form:
Statt
def get_data(self, path):
"""Return the data from path as raw bytes."""
with _io.FileIO(path, 'r') as file:
return file.read()
brauche ich
def get_data(self, path):
"""Return the data from path as raw bytes."""
return "Mein Quellcode als Zeichenkette"
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.
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
anonym44

__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?
Sie gut aus, wie verwendet man das? Kann ich damit ein Modul aus einer Zeichenkette laden?
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, nach nur wenigen Sekunden googeln findet man zb https://stackoverflow.com/questions/141 ... rom-memory
anonym44

__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
Funktioniert nicht.
Benutzeravatar
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.
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

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()
Antworten