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