Как эффективно использовать базовый класс - PullRequest
0 голосов
/ 25 июня 2019

Я думаю, что использование базового класса было бы очень полезно для набора классов, которые я определяю для приложения.В приведенном ниже (возможно, неправильном) примере я обрисовываю, что я собираюсь сделать: базовый класс, содержащий атрибут, который я не хочу определять несколько раз.В этом случае базовый класс определит базовую часть пути к файлу, которую каждый дочерний класс затем будет использовать для создания своих более конкретных путей.

Однако, похоже, мне нужно было бы ввестиparent_path к __init__ методу дочерних классов в любом случае, независимо от использования одиночного наследования от базового класса.

import pathlib

class BaseObject:
    def __init__(self, parent_path: pathlib.Path):
        self.parent_path = parent_path

class ChildObject(BaseObject):
    def __init__(self, parent_path: pathlib.Path, child_path: pathlib.Path):
        super(ChildObject, self).__init__()
        self.full_path = parent_path.joinpath(child_path)

class ChildObject2(BaseObject):
    ...

class ChildObject3(BaseObject):
    ...

Если это так, то есть ли причина использовать наследованиеиз базового класса, подобного этому, кроме как прояснить, что пытается сделать моя реализация?

Ответы [ 3 ]

3 голосов
/ 25 июня 2019

Я не вижу преимущества для этой реализации.Как вы заметили, вы все равно должны передать parent_path в дочерний экземпляр.Вы также должны назвать «1002 *» родителя, который противодействует «улучшению» ясности в одну строку.

На мой взгляд, вы уже прояснили это, используя хорошие имена атрибутов.Я бы переключился с parent_path на base_path, чтобы читатель не искал родительский объект.

В качестве альтернативы, вы можете сделать этот атрибут class дляparent: установите его один раз, и пусть все объекты делят его по прямой ссылке, а не передают одно и то же значение для каждого экземпляра.

0 голосов
/ 25 июня 2019

Чтобы получить полезность такой схемы наследования - сделайте ваши BaseObject более гибкими и примите необязательные (ключевые слова) аргументы:

import pathlib

class BaseObject:
    def __init__(self, parent_path: pathlib.Path, child_path: pathlib.Path=None):
        self.parent_path = parent_path
        self.full_path = parent_path.joinpath(child_path) if child_path else parent_path

class ChildObject(BaseObject):
    ...

class ChildObject2(BaseObject):
    ...

class ChildObject3(BaseObject):
    ...


co = ChildObject(pathlib.Path('.'), pathlib.Path('../text_files'))
print(co, vars(co))
# <__main__.ChildObject object at 0x7f1a664b49b0> {'parent_path': PosixPath('.'), 'full_path': PosixPath('../text_files')}
0 голосов
/ 25 июня 2019

Да, правильно, что вы должны предоставить parent_path в вызове __init__ родительского объекта, то есть super(ChildObject, self).__init__(parent_path) (вы пропустили указание parent_path в вашем примере).

Однако,это Python, поэтому обычно есть помощь, чтобы вы могли избежать написания стандартного кода.В этом случае я бы рекомендовал использовать библиотеку attrs .При этом вы можете даже не писать свои классы init вместе.

...