String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true
Убедитесь, что вы понимаете, почему. Это потому, что сравнение ==
сравнивает только ссылки; equals()
метод сопоставляет содержимое по символу.
Когда вы вызываете new для a
и b
, каждый получает новую ссылку, указывающую на "foo"
в таблице строк. Ссылки разные, но контент один и тот же.
Во-первых, подход на основе классов, хотя это не кажется оправданным.
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)