Link __init__ 中的函数
Link function in an __init__
我正在 python 中编写一些代码,但遇到了一些小问题:
我定义了几个版本的函数,并希望在创建对象时在 __init__
函数中分配其中一个。我需要那些函数有一个 self
参数。
我找到了一种方法,但我无法判断我是否正确使用了该语言。
在my_class.py
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
my_class.fun = my_class.__dict__['fun_' + str(fun_version)]
在test.py
import my_class
my_instance_1 = my_class.my_class(attr = 2, fun_version = 1)
print(my_instance_1.fun(1))
my_instance_2 = my_class.my_class(attr = 2, fun_version = 2)
print(my_instance_2.fun(1))
结果符合预期:
3
1
有没有更优雅的方法呢?我觉得在 __init__
函数中定义 class 方法很尴尬。
实现您想要的效果的一种简单方法是(class 为简单起见,将测试代码放在一个文件中):
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
我正在 python 中编写一些代码,但遇到了一些小问题:
我定义了几个版本的函数,并希望在创建对象时在 __init__
函数中分配其中一个。我需要那些函数有一个 self
参数。
我找到了一种方法,但我无法判断我是否正确使用了该语言。
在my_class.py
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
my_class.fun = my_class.__dict__['fun_' + str(fun_version)]
在test.py
import my_class
my_instance_1 = my_class.my_class(attr = 2, fun_version = 1)
print(my_instance_1.fun(1))
my_instance_2 = my_class.my_class(attr = 2, fun_version = 2)
print(my_instance_2.fun(1))
结果符合预期:
3
1
有没有更优雅的方法呢?我觉得在 __init__
函数中定义 class 方法很尴尬。
实现您想要的效果的一种简单方法是(class 为简单起见,将测试代码放在一个文件中):
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