python - 从类中的方法中提取公共逻辑的 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)
有没有更好的方法来完成类中公共逻辑的提取而不使其成为静态方法?
解决方案
推荐阅读
- python - 根据右列 pandas df 中的撇号数更改左列中的数字
- linux - Nginx 在子文件中用相同的键重写父规则?
- google-apps-script - 如何复制单元格的最高值?
- python - 如何修复此错误 IndexError: too many indices for array
- join - Kafka Stream 加入 GlobalKtable 仅在重新发送对象后工作
- deep-copy - Specman 中的 deep_copy 和 gen 保存有什么区别?
- javascript - 在字符串和符号中提取数字
- linux - 如何检查值是否包含bash中的字符
- sql - 更新损坏的 JSON 时,超越 JSON 文本的格式不正确
- java - Java中this和getClass的区别