Mein spezifischer Anwendungsfall ist Ich versuche, pathlib.Path
Unterklasse zu bilden. Ich möchte in der Lage sein, einige Funktionen hinzuzufügen oder zu überschreiben, aber ich möchte auch den gesamten Pfad erben. Pfad hat eine __new__
und in ihm hat:Wie wird eine Klasse abgeleitet, die ein __new__ hat und auf dem Wert von cls beruht?
if cls is Path:
cls = WindowsPath if os.name == 'nt' else PosixPath
Mit anderen Worten Pfad erfordert es die richtige Klasse übergeben. Das Problem ist, ich weiß nicht, wie ich meine Klasse erstellen und Path.__new__
mit cls == Path
aufrufen.
Ich habe viele Dinge ausprobiert und jedes gibt mir ein anderes Problem. Dieser gibt mir AttributeError: type object 'RPath' has no attribute '_flavour'
, weil ich versuche, die Elternklasse zu überschreiben.
Python3:
class RPath(Path):
def __new__(cls, basedir, *args, **kwargs):
return Path.__new__(cls, *args, **kwargs)
def __init__(self, basedir, *pathsegs):
super().__init__()
self.basedir = basedir
def newfunction(self):
print('Something new')
Und dieser gibt kehrt ein Path-Objekt, und daher nicht erlaubt, mir meine Überschreibungen zu tun.
def __new__(cls, basedir, *args, **kwargs):
return Path.__new__(Path, *args, **kwargs)
Ich habe auch versucht, verschiedene Verwendungen von super()
, ohne Erfolg.
Dies scheint wie es sollte ziemlich einfach sein. Was vermisse ich?
Update: Was versuche ich zu erreichen? Insbesondere möchte ich class RPath(basedir, *pathsegments)
machen:
rpath=RPath('\root\dir', 'relpath\path2\file.ext)
assert rpath.basedir == '\root\dir' # True
rpath.rebase('\new_basedir')
assert rpath.basedir === '\newbasedir' # True
# And while I'm at it
assert rpath.str == str(rpath) # make str a property == __str__(self)
Was ist die genaue Funktionalität, die Sie in __new__ einfügen möchten? – Meitham
Sie müssen hier klarstellen, was Sie zu tun versuchen. Die Funktionalität von 'Path .__ new__', die Sie beibehalten möchten, wird eine * andere Klasse * instanziieren. Wenn Sie also diesen Teil des Codes ausführen lassen würden, würde Ihre Unterklasse verschwinden. –
Aktualisiert oben. Tut mir leid, ich war nicht klar genug. Genauer gesagt ruft pathlib nicht '__init__' auf. Irgendwo möchte ich das erste Argument 'class RPath (baselib, * pathsegments) nehmen und' self.baselib = baselib' in '__new__' oder in meinem eigenen' _init__' setzen. –