您的问题归结为“我处于哪种工作流程中?” 解决此类问题的传统方法是使用面向对象的模式。正确使用面向对象的设计通常会消除条件。
将方法放在一个类上。您可以在实例化时传递“它是什么”,也可以根据您的需要使用继承对其进行建模。
使用单个类并在实例化时传递“种类”:
class Workflow:
def __init__(self, kind):
self.kind = kind
def f1(self):
self.f2()
def f2(self):
self.f3()
def f3(self):
self.f4()
def f4(self):
print(self.kind)
# now use it
a = Workflow(123)
b = Workflow(456)
a.f1() # prints 123
b.f1() # prints 456
注意没有if
涉及。没有必要。这样的事情会错过重点:
def f4(self):
if self.kind == "A":
print(123)
else if self.kind == "B":
print(456)
早先在实例化对象时进行了区分。此后,每个实例都有自己的行为,这些行为不基于任何东西。
如果这两个工作流具有更复杂的行为(例如f4()
,实际上做了一些重要的工作),那么您可能需要继承。定义一个基类,然后将其子类化为您希望能够创建的每种事物。
class WorkflowBase:
def f1(self):
self.f2()
def f2(self):
self.f3()
def f3(self):
self.f4()
def f4(self):
return
class WorkflowA(WorkflowBase):
def f4(self):
print(123)
class WorkflowB(WorkflowBase):
def f4(self):
print(456)
# using them
a = WorkflowA()
b = WorkflowB()
a.f1() # prints 123
b.f1() # prints 456
在这里,行为被融入其中,WorkflowA
或者WorkflowB
,您拥有一个类或另一个类的实例这一事实激活了不同的结果。
它也不需要您检查调用堆栈,这是一个相当复杂的条件。这样做很有趣,我很了解它的魅力,但它很慢,而且它会让你的代码难以被其他人理解。