如何使从pathlib.Path继承的子类方法返回Path而不是子类

0 投票
1 回答
35 浏览
提问于 2025-04-14 16:22

假设我定义了一个从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)

撰写回答