【发布时间】:2012-06-18 00:52:50
【问题描述】:
我有几个不同类型的对象(不同的函数名称,不同的签名),我对它们进行了修补,以便有一种从不同函数访问它们的通用方法。简而言之,有一个调度程序接收我要修补的对象,并根据对象类型调用不同的修补程序。修补程序将为对象添加方法:
def patcher_of_some_type(object):
def target(self, value):
# do something and call self methods
object.target = types.MethodType(target, object)
# many more of these
随着程序变得越来越复杂,围绕对象(或对象类)进行包装似乎是更好的主意。一些修补程序共享公共代码或相互关联。但我不控制对象的创建,也不控制类的创建。我只得到对象。即使我能做到这一点,我也只想包装(或修补)某些对象,而不是全部。
一种解决方案可能是将基类添加到现有对象,但我不确定这是多么可维护和安全。还有其他解决方案吗?
【问题讨论】:
-
所以这些类不是你定义的?
-
不,这些类是在我无法控制的库中定义的。我可以从所有类创建包装器,但这仅适用于我实例化的对象,不适用于库实例化的对象。如果我修补库,则会发生相反的情况:所有对象都已修补,而我只想修补其中的一些。最后,如果我包装一些对象,我需要保留自己的数据结构来引用它们。这就是为什么我现在正在修补我想要的对象。
-
我会定义一个包装类来保存对象。需要有不同类型的共享公共代码的包装器可以通过拥有一个基本包装器类并从中派生专门的版本来处理。基本的 OOP 东西...
-
@martineau:我不明白你关于我的问题的建议。我建议创建一个包装类(一个他们专门的)版本,我要问的是如何以一种健壮且可维护的方式将所有这些类方法添加到现有对象中。
-
@Hernan: 包装类的整个想法是它充当proxy 或与某些底层对象(委托)的接口,因此不需要添加方法来该对象(大多数语言无论如何都做不到)。除此之外,一般来说,可能无法以“稳健且可维护的方式”执行您所要求的操作,因此即使您应该避免这样做。
标签: python inheritance metaclass monkeypatching