如何使从pathlib.Path继承的子类方法返回Path而不是子类
假设我定义了一个从Path类继承的子类,我想使用Path
中的一些方法。比如这里的Path.glob()
:
from pathlib import Path
class PhotoDir(Path):
pass
# some custom methods
if __name__ == "__main__":
path: str = r"Y:\Picture\2023\2023-11-03"
photoDir: PhotoDir = PhotoDir(path)
print(list(photoDir.glob("*")))
得到的结果是:
[
PhotoDir('001.jpg'),
PhotoDir('002.jpg')
]
从Path类中所有的方法都会返回这个子类PhotoDir
。
我期待的结果是:
[
Path('001.jpg'),
Path('002.jpg')
]
如果我再定义一个Path的子类Photo
,那么结果应该是:
[
Photo('001.jpg'),
Photo('002.jpg')
]
我尝试过的
我试着用super().glob()
来重写方法,但结果还是一样。(如果我没错的话,这没什么区别):
class PhotoDir(Path):
def glob(
self, pattern: str, *, case_sensitive: bool | None = None
) -> Generator[Self, None, None]:
return super().glob(pattern, case_sensitive=case_sensitive)
我还在子类中尝试了Path(self).glob()
。这个方法有效,但我觉得有点不太对劲。(我不知道,也许是对的。我刚学Python)
class PhotoDir(Path):
def glob(
self, pattern: str, *, case_sensitive: bool | None = None
) -> Generator[Self, None, None]:
return Path(self).glob(pattern, case_sensitive=case_sensitive)
现在我采取了一个变通的方法:
class PhotoDir:
def __init__(self, *args: str | PathLike[str]) -> None:
self.path: Path = Path(*args)
我根本没有继承Path类。与其使用photoDir.glob()
,我直接用photoDir.path.glob()
。这样也能正常工作,但在Python中有没有更聪明的方法呢?
1 个回答
0
你的 PhotoDir
类并不是用来表示一个随便的文件路径,所以不适合用继承的方式来处理。它实际上表示的是一个目录,而这个目录有一个属性,就是用来标识它的文件路径。因此,你最后提到的组合方式才是合适的解决方案。
class PhotoDir:
def __init__(self, *args: str | PathLike[str]) -> None:
self.path: Path = Path(*args)
def glob(self, *args, **kwargs):
return self.path.glob(*args, **kwargs)