Python 3.x python3同一类中方法的默认类属性

Python 3.x python3同一类中方法的默认类属性,python-3.x,class,oop,default-value,Python 3.x,Class,Oop,Default Value,有人能建议如何实现上述目标吗 我也尝试过在构造函数中将func参数设置为默认值func2,但这也会出错 因此,稍后,在类测试的某个地方,我可以调用self.func,而不是反复运行条件来确定应该使用func1还是func2 class Test: func = self.func2 # default: func is func2 by default # tried Test.func2 as well and Pycharm shows error def __in

有人能建议如何实现上述目标吗

我也尝试过在构造函数中将func参数设置为默认值func2,但这也会出错

因此,稍后,在类测试的某个地方,我可以调用self.func,而不是反复运行条件来确定应该使用func1还是func2

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
****解决方案(我所做的)****

在main.py中:

self.func()

这将成功调用t.func1(或t.func2,如果指定),并通过调用高阶方法t.func来访问t实例属性。您可以根据
func
参数的值,在
\uuu init\uuuu
方法中设置默认值:

也许是这样的:

t = Test(func=Test.func1)
t.func(t, **kwargs)
输出:

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()

您可以根据
func
参数的值,在
方法中设置默认值:

也许是这样的:

t = Test(func=Test.func1)
t.func(t, **kwargs)
输出:

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()

如果不使用
self
(未定义)并且将其移动到类定义的末尾,则在类范围内执行赋值的代码将起作用,这样
func2
在运行时将存在于命名空间中

func2
func1

我要注意的是,当您将一个函数赋给一个类变量时,它将被视为一个方法,因此您可能需要将
func2
更改为将
self
作为其第一个参数。对于指定为实例变量的方法,绑定行为不会发生,就像传递给
\uuuu init\uuuu
方法的任何
func
一样。如果您想要为这些对象实现绑定行为,您需要自己实现它(可能使用
functools.partial
)。

如果您不使用
self
(未定义),并且如果您将其移动到类定义的末尾,则在类范围内执行赋值的代码可以工作,因此
func2
在运行时将存在于名称空间中

func2
func1


我要注意的是,当您将一个函数赋给一个类变量时,它将被视为一个方法,因此您可能需要将
func2
更改为将
self
作为其第一个参数。对于指定为实例变量的方法,绑定行为不会发生,就像传递给
\uuuu init\uuuu
方法的任何
func
一样。如果您想要为这些绑定行为,您需要自己实现它(可能使用
functools.partial
).

您试图解决什么问题?将同一方法的多个备选实现中的一个属性设置为默认值,以便在类中重用请参阅可能有帮助的编辑。传递给
\uuuuu init\uuuuu
func
是否应该是
func1
func2
?@TianboJi yes func应该是多个函数中的任意一个选项您试图解决的问题是什么?将同一方法的多个备选实现之一的属性设置为默认值,以便在类中重用请参阅可能有帮助的编辑。传递给
\uuuuuu init\uuuuu
func
是否应该是
func1
func2
?@TianboJi yes func应该是多个函数中的任意一个选项问题,如何在构造时通过Test.func2作为func参数而不在构造后重新分配?您可以执行
t=Test(func=Test.func2)
它说明缺少1个位置参数。我猜这是因为实例方法中缺少“self”第一个参数?通过将目标对象实例作为第一个参数传递给目标中定义的高阶方法(例如测试实例)解决了这一问题。因此,目标对象(测试实例)解析为“self”。事实上,self作为func2的参数丢失了,对不起。问题,我如何在构造时通过Test.func2作为func参数,并且在构造后不重新分配?您可以执行
t=Test(func=Test.func2)
它说明缺少1个位置参数。我猜这是因为实例方法中缺少“self”第一个参数?通过将目标对象实例作为第一个参数传递给目标中定义的高阶方法(例如测试实例)解决了这一问题。因此,目标对象(测试实例)解析为“self”。实际上,self作为func2的参数丢失,很抱歉。