Python 3.x python3同一类中方法的默认类属性
有人能建议如何实现上述目标吗 我也尝试过在构造函数中将func参数设置为默认值func2,但这也会出错 因此,稍后,在类测试的某个地方,我可以调用self.func,而不是反复运行条件来确定应该使用func1还是func2Python 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
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的参数丢失,很抱歉。