【发布时间】:2017-03-14 22:32:19
【问题描述】:
根据类的输入,需要在一个通用接口下使用不同的方法(这里称为method)。其中哪一个更 Pythonic?
尝试 #1
class ExampleClass(object):
def __init__(self, a=None, b=None):
self.a = a
self.b = b
if a is not None:
self.method = self._a_method
else:
self.method = self._b_method
def method(self):
raise NotImplementedError
def _method_a(self):
return "I am a method that relies on input: " + self.a
def _method_b(self):
return "I am a method that relies on input: " + self.b
或尝试 #2:
class ExampleClass(object):
def __init__(self, a=None, b=None):
self.a = a
self.b = b
def method(self):
if self.a is not None:
return self._method_a(self)
else:
return self._method_b(self)
def _method_a(self):
return "I am a method that relies on input: " + self.a
def _method_b(self):
return "I am a method that relies on input: " + self.b
在这种情况下可能无关紧要,但在我的情况下,我有不止一个 method,这意味着方法 #2 违反了 DRY 原则(如果,否则每个逻辑中的逻辑都是相同的各种methods)。
另一方面,在 __init__ 中动态分配 _method_* 函数是否很尴尬,因为它在尝试 #1 中失败了?
【问题讨论】:
-
如果这是工作代码,请将其发布到Code Review。在 Stack Overflow 上,您的问题过于基于意见(除非 Guido 碰巧回答)
-
这两个选项都运行得很好并且做同样的事情。我想知道是否有“一种正确的方式”(或首选方式)来做到这一点。
-
我肯定更喜欢第二种选择。
-
如果方法 a 和 b 如此不同以至于这是必要的,那么假装它们是相同的方法是否有意义?您实际上不应该有两个不同的(子)类吗?这么一个微不足道的例子,我们怎么判断呢?
-
我知道您想要一个一致的接口,但这并不一定意味着要编写一个类。此外,如果用户同时提供 a 和 b,或者两者都不提供怎么办?没有更多信息,这只能用意见来回答,实际上是xyproblem.info。
标签: python coding-style