Belirli kullanım durumum, pathlib.Path
sınıfını alt sınıflara ayırmaya çalışıyorum. Bazı işlevleri ekleyebilmek veya geçersiz kılmak istiyorum ama aynı zamanda tüm Yol'u devralmak istiyorum. Yol bir __new__
sahiptir ve içinde vardır:__new__'ye sahip olan ve cls değerine dayanan bir sınıf nasıl alt sınıflara ayrılır?
if cls is Path:
cls = WindowsPath if os.name == 'nt' else PosixPath
Başka bir deyişle, Yol buna uygun sınıf geçme gerektirir. Sorun, MY sınıfını nasıl oluşturacağımı bilmiyorum ve'u cls == Path
ile nasıl arayacağımı bilmiyorum.
Birçok şeyi denedim ve her biri bana farklı bir sorun veriyor. Bu bana AttributeError: type object 'RPath' has no attribute '_flavour'
verdi, çünkü üst sınıfı geçersiz kılmaya çalışıyorum.
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')
Ve bu benim geçersiz kılmaları yapmasına izin vermez, dolayısıyla döndürür bir yol nesnesini verir ve.
def __new__(cls, basedir, *args, **kwargs):
return Path.__new__(Path, *args, **kwargs)
Ben de boşuna, super()
çeşitli kullanımlarını çalıştı.
Bu oldukça kolay olmalı gibi görünüyor. Neyi kaçırıyorum?
Güncelleme: Neyi başarmaya çalışıyorum? Özellikle, class RPath(basedir, *pathsegments)
yapmak istiyorum:
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)
__new__ içine yerleştirmek istediğiniz işlevsellik nedir? – Meitham
Burada yapmaya çalıştığınız şeyi netleştirmeniz gerekiyor. Korumaya çalıştığınız Path .__ new__ işlevinin işlevselliği, * farklı bir sınıf * oluşturacak, böylece kodun bu bölümünü çalıştırmaya karar verdiyseniz, alt sınıflarınız gider. –
Yukarıda güncellendi. Üzgünüm yeterince açık değildim. Ve daha spesifik olarak, pathlib '__init__' diyor. Yani bir yerde ilk argüman 'class RPath (baselib, * pathsegments)' almak istiyorum ve '__new__''de' self.baselib = baselib' veya kendi '__init__''da ayarlamak istiyorum. –