提问人:mavex857 提问时间:8/30/2023 最后编辑:frankfalsemavex857 更新时间:8/31/2023 访问量:117
Python 调用类函数作为其他类属性
Python call class function as other classes attribute
问:
是否可以创建这样的构造,其中类的方法用于设置另一个类的属性值。然后,应该在 的实例上调用此方法,而无需直接调用。foo
A
B
A
A.foo()
class A:
def foo(self):
print("Hello")
class B:
def __init__(self):
self.func = A.foo
def bar(self):
obj = A()
obj.self.func()
我的用例是,在方法中可以选择不同函数的属性值,通过语句设置属性值;这是因为直接调用类 A 的方法是不可能的,因为不清楚将选择哪一个。__init__()
B
A
self.func
if-else
答:
3赞
juanpa.arrivillaga
8/30/2023
#1
在这种情况下,您可以显式传递实例:
class A:
def foo(self):
print("Hallo")
class B:
def __init__(self):
self.func = A.foo
def bar(self):
obj = A()
self.func(obj)
评论
0赞
mavex857
8/30/2023
如果采用像这样的函数参数呢?我将如何通过它们?喜欢?foo
def foo(self, arg):
self.func(obj, arg)
0赞
frankfalse
8/30/2023
@mavex857 是的,您可以使用 .您可能必须修改该方法并向其添加参数,如下所示:.self.func(obj, arg)
bar()
arg
def bar(self, arg):
0赞
juanpa.arrivillaga
8/30/2023
@mavex857是的,在这一点上,它不像一种方法。它只是一个常规功能。您只需将所有参数显式传递给它
1赞
frankfalse
8/30/2023
#2
在下面的代码中,我在方法中添加了构造,因为您在问题中提到了这个构造:if-else
__init__()
class A:
def foo(self):
print("Hallo")
def foo1(self):
print("Hallo 1")
def foo2(self):
print("Hallo 2")
class B:
def __init__(self, x=0):
if x == 1:
self.func = A.foo1
elif x == 2:
self.func = A.foo2
else:
self.func = A.foo
def bar(self):
obj = A()
self.func(obj)
B().bar()
B(1).bar()
B(2).bar()
B(3).bar()
脚本的执行将产生以下输出:
Hallo
Hallo 1
Hallo 2
Hallo
输出显示该方法调用类 A 的不同方法,并且选择的方法取决于传递给该方法的参数的值。bar()
__init__()
A 的实例不是必需的
此外,该类的方法可以如下:bar()
B
def bar(self):
self.func(A)
这是因为您可以使用属性引用来代替类实例化来访问类的方法。foo()
A
评论
1赞
Barmar
8/31/2023
只是一个样式建议,但我会使用一个可选参数来做:而不是测试。def __init__(self, x=0):
len(x)
0赞
frankfalse
8/31/2023
我已经测试了您的建议,它运行良好。我根据您的建议修改了我的答案。
评论
obj.self.func()
self.func(obj)
func
B
bar