【问题标题】:Python 3 OOP Calling MethodsPython 3 OOP 调用方法
【发布时间】:2019-03-10 17:01:56
【问题描述】:

我的目标是实现具有 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) 更有效的方法,因为它们是相同的。

【问题讨论】:

  • 您的问题是什么?
  • f4_1f4_2f4_3f1f2f3 中的哪一个有任何不同其他 ?如果没有,您只需要一个将函数作为参数的f4
  • 另外,只有静态方法的类不需要__init__,因为静态方法不使用属性。与 Java 不同,如果不需要,您不必必须使用类;一个只包含定义的解决方案没有任何问题,事实上,在许多情况下,这是努力的目标。
  • Q1:如何在Implement的方法中调用类InitialAction的方法? Q2:我应该在类中的方法定义中每次都使用 (a,b) 吗?
  • 回答@chepner,无论使用哪种方法,f4中的动作都是一样的。

标签: python algorithm oop methods quicksort


【解决方案1】:

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

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 的原因是因为它所做的只是保存ab 的值,您可以直接将它们直接传递给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
    ...

【讨论】:

    【解决方案2】:

    绝对没有理由用三个方法创建另一个类,除了调用第一个类中定义的方法之外没有其他功能。

    假设您实际上只是想要一个包装器,以下将起作用:

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 2020-08-03
      • 2021-12-02
      • 2022-11-19
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多