Il mio caso d'uso specifico è che sto provando a sottoclasse pathlib.Path
. Voglio essere in grado di aggiungere o sovrascrivere alcune funzionalità, ma voglio anche ereditare tutto il percorso. Percorso ha un __new__
e in essa ha:Come sottoclasse una classe che ha un __new__ e si basa sul valore di cls?
if cls is Path:
cls = WindowsPath if os.name == 'nt' else PosixPath
In altre parole, il percorso richiede il passaggio alla classe propria. Il problema è che non so come creare entrambi la classe MY e chiamare Path.__new__
con cls == Path
.
Ho provato molte cose e ognuna mi dà un problema diverso. Questo mi dà AttributeError: type object 'RPath' has no attribute '_flavour'
perché sto provando a sovrascrivere la classe genitore.
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')
E questo dà restituisce un oggetto Path, e quindi non mi permette di fare il mio sostituzioni.
def __new__(cls, basedir, *args, **kwargs):
return Path.__new__(Path, *args, **kwargs)
Ho anche provato vari usi di super()
, senza alcun risultato.
Sembra che dovrebbe essere abbastanza facile. Cosa mi manca?
Aggiornamento: cosa sto cercando di realizzare? In particolare, voglio fare 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)
Qual è la funzionalità esatta che si desidera inserire in __new__? – Meitham
Hai bisogno di chiarire cosa stai cercando di fare qui. La funzionalità di 'Path .__ new__' che stai tentando di conservare creerà un'istanza di una * classe diversa *, quindi se hai ottenuto quella parte del codice da eseguire, la sottoclasse andrebbe via. –
Aggiornato sopra. Mi spiace di non essere stato abbastanza chiaro. E più specificamente, pathlib non chiama '__init__'. Quindi da qualche parte voglio prendere il primo argomento 'class RPath (baselib, * pathsegments)' e impostare 'self.baselib = baselib' in' __new__' o nel mio '__init__'. –