python3默认类属性属于同一类中的方法


class Test:
    func = self.func2 # default: func is func2 by default
    # tried Test.func2 as well and Pycharm shows error
    def __init__(self, func=None):
        if func is not None:
            self.func = func
    def func1(self):
        pass
    def func2(self):
        pass

任何人都可以建议如何实现上述目标吗?

我也尝试将func参数设置为默认为构造函数中的func2,但这也错误。

所以以后,我可以在类测试中的某个地方进行self.func,而不是反复运行条件,以找出是否应使用func1或func2

self.func()

****解决方案(我做了什么(****

在main.py中:

t = Test(func=Test.func1)
t.func(t, **kwargs)

这应该通过高阶方法t.func

访问t.func1(或指定的t.func2((或指定(访问t instance_attributes

您可以根据func参数的值:

的值设置__init__方法中的默认值

也许这样的东西:

class Test:
    def __init__(self, func=None):
        if func is None:
            self.func = self.func2
        else:
            self.func = func
    def func1():
        print('func1')
    def func2(self):
        print('func2')
Test().func()
Test(Test.func1).func()

输出:

func2
func1

如果您不使用self(未定义(,则在类范围内进行分配的代码将有效func2运行时将存在于命名空间中。

class Test:
    def __init__(self, func=None):
        if func is not None:
            self.func = func
    def func1():
        pass
    def func2():
        pass
    func = func2 # this will work down here

我会注意到,当您将函数分配给类变量时,它将被视为方法,因此您可能需要更改func2以期望self作为其第一个参数。对于分配给实例变量的方法,绑定行为不会发生,就像任何传递给__init__方法的func一样。如果您想要这些绑定行为,则需要自己实施(也许使用functools.partial(。

最新更新