Как сделать так, чтобы метод подкласса, унаследованный от pathlib.Path, возвращал Path вместо подклассаPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Как сделать так, чтобы метод подкласса, унаследованный от 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() в подклассе. Это работает, но мне кажется немного неправильным. (IDK. Возможно, это правильно. Я новичок в 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)
I didn't subclassing Path at all. Instead of using photoDir.glob(), I'm using photoDir.path.glob(). It works fine, but is there a smarter way to do this in Python?


Источник: https://stackoverflow.com/questions/781 ... -instead-o
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»