我最近发现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)
是否有更好的方法可以在不将类设为静态方法的情况下完成类中公共逻辑的提取?