Простой способ получить то, что вы хотите (класс и тестовый код в одном файле для простоты):
class my_class(object):
fun_1 = lambda self,val: self.attr + val
fun_2 = lambda self,val: self.attr - val
def __init__(self, attr, fun_version):
self.attr = attr
self.fun = getattr(self, 'fun_' + str(fun_version))
my_instance_1 = my_class(attr = 2, fun_version = 1)
print(my_instance_1.fun(1))
my_instance_2 = my_class(attr = 2, fun_version = 2)
print(my_instance_2.fun(1))
#Proof that instances are independent:
print(my_instance_1.fun(1))
Отпечатки:
3
1
3
Если варианты fun
не нужны атрибуты экземпляра (являются статическими методами), это можно записать следующим образом (это также можно записать с помощью lambda
, как-то похоже на первый вариант, но это будет выглядеть ужасно):
class my_class(object):
@staticmethod
def fun_1(val):
return 1 + val
@staticmethod
def fun_2(val):
return 2 + val
def __init__(self, attr, fun_version):
self.attr = attr
self.fun = getattr(my_class, 'fun_' + str(fun_version))
# or (as above):
# self.fun = getattr(self, 'fun_' + str(fun_version))
my_instance_1 = my_class(attr = 2, fun_version = 1)
print(my_instance_1.fun(1))
my_instance_2 = my_class(attr = 2, fun_version = 2)
print(my_instance_2.fun(1))
print(my_instance_1.fun(1))
Печать
2
3
2