Python 调用类函数作为其他类属性

Python call class function as other classes attribute

提问人:mavex857 提问时间:8/30/2023 最后编辑:frankfalsemavex857 更新时间:8/31/2023 访问量:117

问:

是否可以创建这样的构造,其中类的方法用于设置另一个类的属性值。然后,应该在 的实例上调用此方法,而无需直接调用。fooABAA.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__()BAself.funcif-else

Python 函数 属性

评论

0赞 Swifty 8/30/2023
我认为它应该有效,前提是您将obj.self.func()self.func(obj)
2赞 Anentropic 8/30/2023
像这样耦合两个类的实现可能是一个坏主意
0赞 juanpa.arrivillaga 8/30/2023
@Anentropic,如果被接受为构造函数的参数,并且实例作为参数提供给funcBbar

答:

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
如果采用像这样的函数参数呢?我将如何通过它们?喜欢?foodef foo(self, arg):self.func(obj, arg)
0赞 frankfalse 8/30/2023
@mavex857 是的,您可以使用 .您可能必须修改该方法并向其添加参数,如下所示:.self.func(obj, arg)bar()argdef 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
我已经测试了您的建议,它运行良好。我根据您的建议修改了我的答案。