Pythonic способ извлечь общую логику из метода в классе - PullRequest
0 голосов
/ 14 октября 2019

Я недавно узнал, что Гвидо сказал, что статические методы, по сути, "случайность".

https://mail.python.org/pipermail/python-ideas/2012-May/014969.html

Теперь мой вопрос состоит в том, как извлечь общую логику, используемую различными функциями вкласс.

Я делал что-то вроде следующего:

class ChildClass(ParentClass):

    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar
        super().__init__(self.foo, self.bar)

    @classmethod
    def from_var3(cls, baz):
        foo, bar = baz.split(',')
        return cls(foo, bar)

    @staticmethod
    def _common_method(qux):
        quux = qux  # do_something
        return quux

    def method1(self):
        qux = [f"{x}-something" for x in self.foo]
        quux = ChildClass._common_method(qux)

        return quux

    def method2(self):
        qux = [f"{x}-somethingelse" for x in self.foo]
        corge = ChildClass._common_method(qux)
        # do something with corge
        return corge

    def method3(self):
        qux = [f"{x}-somethingcompletelyelse" for x in self.foo]
        qux.sort(key=ChildClass._common_method)

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

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

def _common_method(qux):
    quux = qux  # do_something
    return quux

class ChildClass(ParentClass):

    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar
        super().__init__(self.foo, self.bar)

    @classmethod
    def from_var3(cls, baz):
        foo, bar = baz.split(',')
        return cls(foo, bar)


    def method1(self):
        qux = [f"{x}-something" for x in self.foo]
        quux = _common_method(qux)

        return quux

    def method2(self):
        qux = [f"{x}-somethingelse" for x in self.foo]
        corge = _common_method(qux)
        # do something with corge
        return corge

    def method3(self):
        qux = [f"{x}-somethingcompletelyelse" for x in self.foo]
        qux.sort(key=_common_method)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...