【问题标题】:Link function in an __init____init__ 中的链接函数
【发布时间】:2019-09-19 03:36:14
【问题描述】:

我正在用 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__ 函数中定义类方法很尴尬。

【问题讨论】:

  • 您知道如果创建了两个具有不同fun_version 的对象,最后一个构造定义了用于整个类的方法(影响所有对象,也影响早期创建的对象)?
  • 不,我没有!这是我想避免的行为。有没有一种方法可以创建与一个实例相关联的乐趣?

标签: python object init


【解决方案1】:

实现您想要的一种简单方法是(为简单起见,将类和测试代码放在一个文件中):

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

【讨论】:

  • 就是这样!它完美无缺。如果例如ˋfunˋ不与任何属性交互(两个输入的和或差),我仍然需要传递ˋselfˋ参数才能使其正常工作?而且这也是最佳的做法?
  • @user185674 我更新了答案。如果您想提供此类特定于实例的功能,这是通常的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2012-09-20
相关资源
最近更新 更多