Методы вызова ООП Python 3 - PullRequest
       4

Методы вызова ООП Python 3

0 голосов
/ 10 марта 2019

Моя цель - реализовать алгоритм с 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??

А также я не уверен, существует ли более эффективный способ, чем использование (a, b) в каждом методе {class InitialAction}, поскольку они одинаковы.

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Во-первых, подход на основе классов, хотя он и не кажется оправданным.

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
    ...
0 голосов
/ 10 марта 2019

Нет абсолютно никаких причин для создания другого класса с тремя методами, которые не имеют никакой функциональности, кроме как для вызова методов, определенных в первом классе.

Предполагая, что вы на самом деле просто хотите обернуть их, будет работать следующее:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...