Python 3 OOP调用方法

Python 3 OOP调用方法,python,algorithm,oop,methods,quicksort,Python,Algorithm,Oop,Methods,Quicksort,我的目标是实现一个有3种变体的算法。我决定创建3个独立的函数,并根据我想要的操作在第4个函数中调用它们。然而,我意识到,以这种方式执行任务,我将有6个功能,3个具有初始操作,3个调用每个操作并执行特定任务。任务是相同的 我决定用Python实现我的解决方案以适应它,我在想使用类和方法是否是个好主意。到目前为止,我的每一个解决方案都只是函数的定义,但我想改进 以下是我迄今为止的逻辑,它只显示了令我困惑的声明: class InitialAction: def __init__(self, a,

我的目标是实现一个有3种变体的算法。我决定创建3个独立的函数,并根据我想要的操作在第4个函数中调用它们。然而,我意识到,以这种方式执行任务,我将有6个功能,3个具有初始操作,3个调用每个操作并执行特定任务。任务是相同的

我决定用Python实现我的解决方案以适应它,我在想使用类和方法是否是个好主意。到目前为止,我的每一个解决方案都只是函数的定义,但我想改进

以下是我迄今为止的逻辑,它只显示了令我困惑的声明:

class InitialAction:
  def __init__(self, a, b):
    self.a = a
    self.b = b
  @staticmethod
  def f1(a, b):
    ...
  @staticmethod
  def f2(a, b):
    ...
  @staticmethod
  def f3(a, b):
    ...

class Implement(self, a, b):
  def __init__(self, a, b):
    self.a = a
    self.b = b

  def f4_1(?)
    some_how_call_f1??
    ...
  def f4_2(?)
    some_how_call_f2??
  def f4_3(?)
    some_how_call_f3??

而且,我也不确定是否有比在{class InitialAction}的每个方法中使用a,b更有效的方法,因为它们是相同的。

首先,基于类的方法,尽管它似乎没有必要

class InitialAction:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def f1(self):
        ...

    def f2(self):
        ...

    def f3(self):
        ...


def f4(f, a, b):
    ...

x = InitialAction(some_a, some_b)

f4(x.f1)  # Implement f4 using f1
f4(x.f2)  # Implement f4 using f2
f4(x.f3)  # Implement f4 using f3
您不需要InitialAction的原因是因为它所做的只是保存a和b的值,您可以自己直接传递给f4。相反,只需分别定义所有四个函数,f4的主体将在适当的时候使用f

def f1(a, b):
    ...

def f2(a, b):
    ...

def f3(a, b):
    ...

def f4(f, a, b):
    # Pass a and b to f when appropriate
    ...

除了调用第一个类中定义的方法之外,绝对没有理由创建另一个包含三个方法的类,这些方法没有任何功能

假设您实际上只需要一个包装器就可以了,下面的方法就可以了:

class InitialAction:
  @staticmethod
  def f1(a, b):
    ...
  @staticmethod
  def f2(a, b):
    ...
  @staticmethod
  def f3(a, b):
    ...

class Implement(object):
  def __init__(self, a, b):
    self.a = a
    self.b = b

  def callFn(self, fn):
      ...
      fn(self.a, self.b)
      ...

myobj = Implement('a', 'b')
myobj.callFn(InitialAction.f1)

你的问题是什么?f4_1、f4_2和f4_3除了调用f1、f2或f3中的哪一个之外,还有什么不同吗?如果不是,您只需要一个f4,它将函数作为参数。此外,只有静态方法的类不需要uu init uu,因为静态方法不使用属性。与Java不同,如果不需要,您不必使用类;只包含定义的解决方案没有错,事实上,在许多情况下这是需要努力的。Q1:如何从类InitialAction中调用实现中的方法?问题2:我是否应该每次在类内的方法定义中使用a、b?回答@chepner,无论使用哪种方法,f4中的操作都是相同的。