从类中的方法中提取公共逻辑的Pythonic方法

2024-04-29 03:48:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近发现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的(从我的persepctive来看,它看起来很脏)。我也不想把这个方法放在一个公共模块中,然后从那里调用。你知道吗

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)

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


Tags: 方法inselfforreturnfoodefbar