W moim konkretnym przypadku użycia próbuję podklasy pathlib.Path
. Chcę móc dodawać lub zastępować niektóre funkcje, ale chcę też dziedziczyć całą ścieżkę. Ścieżka ma __new__
aw niej posiada:Jak podklasować klasę, która ma __new__ i opiera się na wartości cls?
if cls is Path:
cls = WindowsPath if os.name == 'nt' else PosixPath
Innymi słowy, droga wymaga podjęcia właściwej klasy do niego. Problem polega na tym, że nie wiem, jak utworzyć MOJĄ klasę i zadzwonić pod numer Path.__new__
z cls == Path
.
Próbowałem wielu rzeczy, a każdy z nich stwarza inny problem. Ten daje mi AttributeError: type object 'RPath' has no attribute '_flavour'
, ponieważ próbuję przesłonić klasy nadrzędnej.
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')
A ten daje Zwraca obiekt Path, a tym samym nie pozwala mi zrobić moje przesłonięcia.
def __new__(cls, basedir, *args, **kwargs):
return Path.__new__(Path, *args, **kwargs)
Próbowałem również różnych zastosowań super()
, na próżno.
Wygląda na to, że powinno być całkiem łatwe. czego mi brakuje?
Aktualizacja: Co staram się osiągnąć? szczególności chcę, aby class RPath(basedir, *pathsegments)
:
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)
Jaka jest dokładna funkcja, którą chcesz wstawić do __new__? – Meitham
Musisz wyjaśnić, co próbujesz tutaj zrobić. Funkcjonalność z 'Path .__ new__', którą próbujesz zachować, stworzy * inną klasę *, więc jeśli udało ci się uruchomić tę część kodu, twoja podklasa zniknie. –
Zaktualizowane powyżej. Przepraszam, nie byłem wystarczająco jasny. A dokładniej, pathlib nie nazywa się '__init__'. Więc gdzieś chcę wziąć pierwszy argument 'class RPath (baselib, * pathsegments)' i ustawić 'self.baselib = baselib' w' __new__' lub we własnym '__init__'. –