首页 > 解决方案 > 从类中的方法中提取公共逻辑的 Pythonic 方法

问题描述

我最近发现 Guido 说静态方法本质上是“意外”。

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)

有没有更好的方法来完成类中公共逻辑的提取而不使其成为静态方法?

标签: pythonpython-3.xoop

解决方案


推荐阅读