首页 > 解决方案 > 有没有办法将函数调用传递给内部对象?

问题描述

python中有没有办法将函数调用传递给内部对象,可能是通过装饰器或包装器?在下面的示例中,A 类拥有 B 类对象的列表,其中一个 B 类对象被选为活动对象。我希望 A 类充当传递功能,只是识别调用转到的 B 类对象中的哪个。但是,A 类事先不知道它要保存什么类型的类,所以我不能只向 A 类添加一个 set_var 函数。它必须适用于 B 类具有的任何通用函数。它的对象列表中只有一种类型的类,因此它可以在实例化时将类 B 作为输入并动态创建函数(如果有可能的话)。客户不知道它是在处理 A 类还是 B 类。下面的代码是我所得到的。

class A:
    def __init__(self):
        self.objects = []
        self.current_object = 0

    def add_object(self, object):
        self.objects.append(object)

class B:
    def __init__(self):
        self.var = 10

    def set_var(self, new_var):
        self.var = new_var

a_obj = A()
b_obj1 = B()
b_obj2 = B()
a_obj.add_object(b_obj1)
a_obj.add_object(b_obj2)

a_obj.set_var(100)

标签: python

解决方案


您可以使用泛型__getattr__委托给包装的对象。


class A:
    def __init__(self):
        self.objects = []
        self.current_object = 0

    def add_object(self, obj):
        self.objects.append(obj)
        self.current_object = obj

    def __getattr__(self, name):
        return getattr(self.current_object, name)


class B:
    def __init__(self):
        self.var = 10

    def set_var(self, new_var):
        self.var = new_var

a_obj = A()
b_obj1 = B()
b_obj2 = B()
a_obj.add_object(b_obj1)
a_obj.add_object(b_obj2)

a_obj.set_var(100)
print(b_obj2.var)

这将打印“100”。

AttributeError如果包装的对象没有预期的方法,您仍然会得到一个。


推荐阅读