python - 有没有办法将函数调用传递给内部对象?
问题描述
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)
解决方案
您可以使用泛型__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
如果包装的对象没有预期的方法,您仍然会得到一个。
推荐阅读
- sql - 在 ORACLE SQL 中将一组列转换为行
- flutter - Flutter 小部件的便携式/二进制格式?
- reactjs - 如何根据本地存储重新渲染反应组件?
- rust - 如何抑制源自宏的 Clippy 警告?
- html - Flex box 根据屏幕分辨率对特定项目进行分组
- protractor - 如何使用 webdriver manager 设置 chome 二进制位置
- linux - 如何在shell脚本中用逗号替换变量中的换行符
- html - Angular 9 - 不能用css变量改变身体背景
- python - Pandas 将一行的值拆分为两个不同的行
- sql-server - SQL Server:函数“abs”不是有效的窗口函数,不能与 OVER 子句一起使用